program SubtractNumbersInBase;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MAX_LENGTH = 50;
var
Base: Integer;
Number1, Number2: string;
Array1, Array2, ResultArray: array[0..MAX_LENGTH - 1] of Integer;
i, j, Len1, Len2, Carry, Diff: Integer;
Valid: Boolean;
c: Char;
begin
// Ввод основания системы счисления
Write('Введите основание системы счисления (2-32): ');
ReadLn(Base);
if (Base < 2) or (Base > 32) then
begin
WriteLn('Ошибка: неверное основание системы счисления.');
Halt;
end;
// Ввод чисел
Write('Введите первое число: ');
ReadLn(Number1);
Write('Введите второе число: ');
ReadLn(Number2);
// Инициализация массивов
for i := 0 to MAX_LENGTH - 1 do
begin
Array1[i] := 0;
Array2[i] := 0;
ResultArray[i] := 0;
end;
// Проверка первого числа
Valid := True;
i := 1;
repeat
c := Number1[i];
if not (((c >= '0') and (c <= '9') and ((Ord(c) - Ord('0')) < Base)) or
((c >= 'A') and (c <= 'Z') and ((Ord(c) - Ord('A') + 10) < Base))) then
Valid := False;
Inc(i);
until (i > Length(Number1)) or not Valid;
if not Valid then
begin
WriteLn('Ошибка: первое число содержит недопустимые символы.');
Halt;
end;
// Проверка второго числа
Valid := True;
i := 1;
repeat
c := Number2[i];
if not (((c >= '0') and (c <= '9') and ((Ord(c) - Ord('0')) < Base)) or
((c >= 'A') and (c <= 'Z') and ((Ord(c) - Ord('A') + 10) < Base))) then
Valid := False;
Inc(i);
until (i > Length(Number2)) or not Valid;
if not Valid then
begin
WriteLn('Ошибка: второе число содержит недопустимые символы.');
Halt;
end;
// Заполнение массива для первого числа
Len1 := Length(Number1);
j := MAX_LENGTH - Len1;
for i := 1 to Len1 do
begin
if Number1[i] in ['0'..'9'] then
Array1[j + i - 1] := Ord(Number1[Len1 - i + 1]) - Ord('0')
else
Array1[j + i - 1] := Ord(Number1[Len1 - i + 1]) - Ord('A') + 10;
end;
// Заполнение массива для второго числа
Len2 := Length(Number2);
j := MAX_LENGTH - Len2;
for i := 1 to Len2 do
begin
if Number2[i] in ['0'..'9'] then
Array2[j + i - 1] := Ord(Number2[Len2 - i + 1]) - Ord('0')
else
Array2[j + i - 1] := Ord(Number2[Len2 - i + 1]) - Ord('A') + 10;
end;
// Вычитание чисел
Carry := 0;
for i := MAX_LENGTH - 1 downto 0 do
begin
Diff := Array1[i] - Array2[i] - Carry;
if Diff < 0 then
begin
Diff := Diff + Base;
Carry := 1;
end
else
Carry := 0;
ResultArray[i] := Diff;
end;
// Вывод результата
Write('Результат: ');
i := 0;
repeat
if ResultArray[i] <> 0 then
Break;
Inc(i);
until i = MAX_LENGTH;
if i = MAX_LENGTH then
Write('0') // Если все нули, результат равен нулю
else
for j := i to MAX_LENGTH - 1 do
begin
if ResultArray[j] < 10 then
Write(Chr(ResultArray[j] + Ord('0')))
else
Write(Chr(ResultArray[j] - 10 + Ord('A')));
end;
WriteLn;
end.