Paster Fob писал(а):Вот никак не придумаю как решать следующую задачу (посчитать разность).Уже <<весь мозг сломал>>.
Вот один из вариантов решения на основе строк.
- Код: Выделить всё
- { Решение к задаче 46-Б:
 Вычитание двух положительных сверхбольших чисел.
 Исходные числа представлены строками, содержащими только цифры.
 Результат может содержать знак минус в первой позиции.
 }
 
 { Сравнение двух ПОЛОЖИТЕЛЬНЫХ чисел
 Возвращает:
 1 -- arg1 > arg2
 0 -- arg1 = arg2
 -1 -- arg1 < arg2
 }
 
 function CompareBigNumber(const arg1, arg2 : string): integer;
 var i: integer;
 begin
 { Если длина разная, то большее число длиннее }
 if Length(arg1) > Length(arg2)
 then CompareBigNumber:=1
 else if Length(arg1) < Length(arg2)
 then CompareBigNumber:=-1
 else begin
 { Если длина одинаковая, то сравниваем цифры, начиная со старших }
 i:=1;
 while (i<Length(arg1)) and (arg1[i]=arg2[i]) do Inc(i);
 if Ord(arg1[i]) > Ord(arg2[i])
 then CompareBigNumber:=1
 else if Ord(arg1[i]) < Ord(arg2[i])
 then CompareBigNumber:=-1
 else CompareBigNumber:=0;
 end;
 end;
 
 { Вычитание двух ПОЛОЖИТЕЛЬНЫХ чисел }
 
 function SubBigNumber(const arg1, arg2 : string): string;
 var a, b : string;
 minus : boolean;
 i,d : integer;
 borrow : integer;  { заём }
 begin
 { сравниваем числа и определяем знак }
 minus:= CompareBigNumber(arg1, arg2)<0;
 { заносим уменьшаемое и вычитаемое так, что a >= b }
 if minus then begin
 a:= arg2;    b:= arg1;
 end else begin
 a:= arg1;    b:= arg2;
 end;
 { перед вычитанием выравниваем длину }
 while Length(b) < Length(a) do b:='0'+b;
 borrow:= 0;  { заём=0 }
 { вычитаем цифры, младшая в конце строки }
 for i:= Length(a) downto 1 do begin
 d:= Ord(a[i]) - Ord(b[i]) - borrow;
 if d<0 then begin
 d:= d+10;
 borrow:= 1;
 end
 else borrow:= 0;
 a[i]:= Chr(d + Ord('0')); { разность сохраняем в a }
 end;
 { удаляем незначащие нули }
 while (a[1]='0') and (Length(a)>1) do Delete(a,1,1);
 { формируем знак }
 if minus then a:='-'+a;
 SubBigNumber:= a;
 end;
 
 begin
 Writeln(SubBigNumber('123','199'));
 Writeln(SubBigNumber('199','123'));
 Writeln(SubBigNumber('1000','1'));
 Writeln(SubBigNumber('1','1000'));
 Writeln(SubBigNumber('0','1000'));
 Writeln(SubBigNumber('1000','1000'));
 Readln;
 end.
 
"В наказание" предлагаю развить задачу, распространив сложение и вычитание для чисел со знаком. То есть, и положительных, и отрицательных.
Добавлено спустя 21 минуту 1 секунду:Ещё один вариант функции сравнения (подходит к строкам не длиннее 255)
- Код: Выделить всё
- function CompareBigNumber(arg1, arg2 : string): integer;
 begin
 { Если длина разная, то большее число длиннее }
 arg1:= Chr(Length(arg1))+ arg1;
 arg1:= Chr(Length(arg2))+ arg2;
 if arg1 > arg2
 then CompareBigNumber:=1
 else if arg1 < arg2
 then CompareBigNumber:=-1
 else CompareBigNumber:=0
 end;
 
Последний раз редактировалось 
Oleg_D 18.09.2012 14:20:41, всего редактировалось 1 раз.
					
Причина: опечатка