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 раз.
Причина: опечатка