fork download
  1. program SubtractNumbersInBase;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. const
  9. MAX_LENGTH = 50;
  10.  
  11. var
  12. Base: Integer;
  13. Number1, Number2: string;
  14. Array1, Array2, ResultArray: array[0..MAX_LENGTH - 1] of Integer;
  15. i, j, Len1, Len2, Carry, Diff: Integer;
  16. Valid: Boolean;
  17. c: Char;
  18.  
  19. begin
  20. // Ввод основания системы счисления
  21. Write('Введите основание системы счисления (2-32): ');
  22. ReadLn(Base);
  23.  
  24. if (Base < 2) or (Base > 32) then
  25. begin
  26. WriteLn('Ошибка: неверное основание системы счисления.');
  27. Halt;
  28. end;
  29.  
  30. // Ввод чисел
  31. Write('Введите первое число: ');
  32. ReadLn(Number1);
  33. Write('Введите второе число: ');
  34. ReadLn(Number2);
  35.  
  36. // Инициализация массивов
  37. for i := 0 to MAX_LENGTH - 1 do
  38. begin
  39. Array1[i] := 0;
  40. Array2[i] := 0;
  41. ResultArray[i] := 0;
  42. end;
  43.  
  44. // Проверка первого числа
  45. Valid := True;
  46. i := 1;
  47. repeat
  48. c := Number1[i];
  49. if not (((c >= '0') and (c <= '9') and ((Ord(c) - Ord('0')) < Base)) or
  50. ((c >= 'A') and (c <= 'Z') and ((Ord(c) - Ord('A') + 10) < Base))) then
  51. Valid := False;
  52. Inc(i);
  53. until (i > Length(Number1)) or not Valid;
  54.  
  55. if not Valid then
  56. begin
  57. WriteLn('Ошибка: первое число содержит недопустимые символы.');
  58. Halt;
  59. end;
  60.  
  61. // Проверка второго числа
  62. Valid := True;
  63. i := 1;
  64. repeat
  65. c := Number2[i];
  66. if not (((c >= '0') and (c <= '9') and ((Ord(c) - Ord('0')) < Base)) or
  67. ((c >= 'A') and (c <= 'Z') and ((Ord(c) - Ord('A') + 10) < Base))) then
  68. Valid := False;
  69. Inc(i);
  70. until (i > Length(Number2)) or not Valid;
  71.  
  72. if not Valid then
  73. begin
  74. WriteLn('Ошибка: второе число содержит недопустимые символы.');
  75. Halt;
  76. end;
  77.  
  78. // Заполнение массива для первого числа
  79. Len1 := Length(Number1);
  80. j := MAX_LENGTH - Len1;
  81. for i := 1 to Len1 do
  82. begin
  83. if Number1[i] in ['0'..'9'] then
  84. Array1[j + i - 1] := Ord(Number1[Len1 - i + 1]) - Ord('0')
  85. else
  86. Array1[j + i - 1] := Ord(Number1[Len1 - i + 1]) - Ord('A') + 10;
  87. end;
  88.  
  89. // Заполнение массива для второго числа
  90. Len2 := Length(Number2);
  91. j := MAX_LENGTH - Len2;
  92. for i := 1 to Len2 do
  93. begin
  94. if Number2[i] in ['0'..'9'] then
  95. Array2[j + i - 1] := Ord(Number2[Len2 - i + 1]) - Ord('0')
  96. else
  97. Array2[j + i - 1] := Ord(Number2[Len2 - i + 1]) - Ord('A') + 10;
  98. end;
  99.  
  100. // Вычитание чисел
  101. Carry := 0;
  102. for i := MAX_LENGTH - 1 downto 0 do
  103. begin
  104. Diff := Array1[i] - Array2[i] - Carry;
  105. if Diff < 0 then
  106. begin
  107. Diff := Diff + Base;
  108. Carry := 1;
  109. end
  110. else
  111. Carry := 0;
  112. ResultArray[i] := Diff;
  113. end;
  114.  
  115. // Вывод результата
  116. Write('Результат: ');
  117. i := 0;
  118. repeat
  119. if ResultArray[i] <> 0 then
  120. Break;
  121. Inc(i);
  122. until i = MAX_LENGTH;
  123.  
  124. if i = MAX_LENGTH then
  125. Write('0') // Если все нули, результат равен нулю
  126. else
  127. for j := i to MAX_LENGTH - 1 do
  128. begin
  129. if ResultArray[j] < 10 then
  130. Write(Chr(ResultArray[j] + Ord('0')))
  131. else
  132. Write(Chr(ResultArray[j] - 10 + Ord('A')));
  133. end;
  134. WriteLn;
  135. end.
  136.  
Success #stdin #stdout 0s 5276KB
stdin
Standard input is empty
stdout
Введите основание системы счисления (2-32): Ошибка: неверное основание системы счисления.