15. december 2003 - 19:37Der er
13 kommentarer og 1 løsning
Operere med meget store tal?
Jeg har brug for at operere med meget store tal (op til 200 cifre). Hvilken real-type skal jeg bruge og endnu vigtigere hvordan bruger jeg f.eks. real48 i praksis?
begin res := ''; carry := 0; ix1 := length(v1); ix2 := length(v2); while (carry > 0) or (ix1 > 0) or (ix2 > 0) do begin tmp := carry; if(ix1 > 0) then begin tmp := tmp + numval(v1[ix1]); ix1 := ix1 - 1; end; if(ix2 > 0) then begin tmp := tmp + numval(v2[ix2]); ix2 := ix2 - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; add := res; end;
function mulpow10(v : string; pow10 : integer) : string;
var res : string; i : integer;
begin res := v; for i := 1 to pow10 do begin res := res + '0'; end; mulpow10 := res; end;
function mulone(v : string; num : integer) : string;
var res : string; ix, tmp, carry : integer;
begin res := ''; carry := 0; ix := length(v); while (carry > 0) or (ix > 0) do begin tmp := carry; if(ix > 0) then begin tmp := tmp + num * numval(v[ix]); ix := ix - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; mulone := res; end;
function mul(v1,v2 : string) : string;
var res : string; i : integer;
begin res := '0'; for i := 1 to length(v2) do begin res := add(res,mulpow10(mulone(v1,numval(v2[i])),length(v2)-i)); end; mul := res; end;
var i : integer; fac : string;
begin (* functionality test *) writeln(add('1234','12345678')); writeln(mulpow10('123',2)); writeln(mulone('123456',2)); writeln(mul('12345','12345')); (* performance test *) fac := '1'; for i := 1 to 500 do begin fac := mul(fac, inttostr(i)); writeln(i,' ',fac); end; end.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.