Avatar billede tt2002 Nybegynder
15. december 2003 - 19:37 Der 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?
Avatar billede arne_v Ekspert
15. december 2003 - 19:40 #1
Ingen af standard typerne kan klare så store tal.

Du skal have en pakke med specielt store tal.

Skal det være real ? (det kun ejo også være integer)
Avatar billede arne_v Ekspert
15. december 2003 - 19:41 #2
real48 er ikke nok !
Avatar billede tt2002 Nybegynder
15. december 2003 - 19:43 #3
behøver vel egentlig ikke være real...
hvad kan du foreslå?
Avatar billede arne_v Ekspert
15. december 2003 - 19:45 #4
Der findes masser af bigin og bigfloat pakker.

Men jeg har tilfældigvis lavet noget primitivt bigint kode til et spørgsmål
her tidligere.
Avatar billede arne_v Ekspert
15. december 2003 - 19:46 #5
Er det sådan noget som det her du søger:

program BigInt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function numval(c : char) : integer;

begin
  numval := ord(c) - ord('0');
end;

function strval(v : integer) : char;

begin
  strval := chr(ord('0') + v);
end;

function add(v1,v2 : string) : string;

var
  res : string;
  ix1, ix2, tmp, carry : integer;

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.
Avatar billede arne_v Ekspert
15. december 2003 - 19:47 #6
Den kan håndtere vilkårligt lange integers.

For noget mere professionelts e f.eks.:
  http://www.delphiforfun.org/Programs/Delphi_Techniques/big_integers.htm
Avatar billede tt2002 Nybegynder
15. december 2003 - 19:47 #7
alt for uoverskueligt...
jeg ville ikke ane hvor jeg skulle begynde...
Avatar billede arne_v Ekspert
15. december 2003 - 19:48 #8
Avatar billede arne_v Ekspert
15. december 2003 - 19:49 #9
Hvad er for uoverskueligt ?
Avatar billede tt2002 Nybegynder
15. december 2003 - 19:49 #10
dit lange indlæg ...
har ikke tjekket siderne endnu
Avatar billede arne_v Ekspert
15. december 2003 - 19:52 #11
Gå ned i bunden og check brugen:

Det er ikke så svært igen.

Selve implementationen kan du jo bare copy paste ind.
Avatar billede tt2002 Nybegynder
15. december 2003 - 19:53 #12
ok
tjekker det og kigger tilbage senere
Avatar billede arne_v Ekspert
16. december 2003 - 23:11 #13
OK ?
Avatar billede tt2002 Nybegynder
19. december 2003 - 21:23 #14
ok... beklager ventetiden
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester