Другие языки программирования и технологии

Delphi Как сложить два очень больших числа?

Числа состоят более чем из 200 цифр менее 255... Т.е. E200 < х < E255... Они записаны строками... Нужен верный, рабочий алгоритм в виде функции, которая возращает строку... Function sum(string1,string2:string):string; var x,i,z:intege... ... begin ... result:=string3; end; Заранее спасибо...
Ut
Utegen
1 601
А если просто в столбик посчитать.. .
Ну я иммю ввиду программу, которая будет
считать в столбик.. .
Мы получим самый быстрый способ сложения
чисел неограниченного размера.. .
Ограничения конечно есть.. . Это размер самого винчестера.. .
Python например считает до Гуглиона.. .
Это число со 100 нулями.. .
А алгоритм - 3-и массива.. . и обычное сложение
с переносом.. . Это для строк.. .
Можно конечно и перевести число из строкового представления
в 16-и ричный вид.. . но на это уйдет много машинного времени.. .
А для ускорения сложения строк можно воспользоваться
таблицей.. . Скорость будет еще выше.. . Остануться только
операции сравнения.. .
Андрей Капицын
Андрей Капицын
3 191
Лучший ответ
Вот код: в простом паскале получаем числа до 510 цифр!
Подделать под Дельфи труда не составит.
type
BigNum = array [0..255] of Byte; { до 256 цифр по 2 на ячейку }

procedure OutNum(N : BigNum);
var
S : String;
R : Byte;
begin
S := '';
for R := 255 downto 0 do
if Not((N[R] = 0) and (S = '')) then
S := S + IntToStr(N[R] div 10) + IntToStr(N[R] mod 10);
if S = '' then S := '0' else if S[1] = '0' then Delete(S, 1, 1);
WriteLn(S);
end;

var
N1, N2 : BigNum;
R : Byte;
Perenos : Word;
Perepolnenie : Boolean;

begin
{ обнуляем числа }
for R := 0 to 255 do begin N1[R] := 0; N2[R] := 0; end;
{ в N2 заносим 1 }
N2[0] := 1;

{ строим последовательность чисел Фибоначчи }
OutNum(N1);
Perepolnenie := False;
repeat
OutNum(N2);

Perenos := 0;
for R := 0 to 255 do
begin
Perenos := Perenos + N1[R] + N2[R];
N1[R] := N2[R];
N2[R] := Perenos mod 100;
Perenos := Perenos div 100;
end;
Perepolnenie := (Perenos > 0);
until Perepolnenie;
end.
Сергей Онищак
Сергей Онищак
93 348