Jump to content
PirateClub.hu

Nagy számok kezelése Stringekkel


NemBen
 Share

Recommended Posts

Hétvégén írtam egy unitot amivel LONGINTnél nagyobb (nemnegyatív, egész) számokat lehet kezelni.

Lehet tanulmányzni és ötleteket adni a továbbfejlesztéshez ;)

Jelenlegi verzó: 1.0

 

unit nsz;

 

interface

 

function add(s,t:string):string; {=s+t}

function kiv(s,t:string):string; {=s-t}

function oszt(s,t:string):string; {=s div t}

function mar(s,t:string):string; {=s mod t}

function szor(s,t:string):string; {=s*t}

function hatv(s,t:string):string; {=s**t}

 

 

 

 

implementation

 

function add(s,t:string):string;

var a,b,c,d,e,f,g,i,j,k:integer;

var u,v:string;

 

begin

a:=0;

b:=0;

c:=0;

d:=0;

e:=0;

f:=0;

g:=0;

i:=0;

j:=0;

k:=0;

u:='';

v:='';

i:=length(s);

j:=length(t);

if i>=j then

begin

for a:=i downto 1 do

begin

val(s[a],c,d);

val(t[a-(i-j)],e,f);

g:=c+e+k;

if g>9 then

begin

k:=1;

g:=g-10;

end

else k:=0;

str(g,v);

insert(v,u,1);

end;

end

else

begin

for a:=j downto 1 do

begin

val(s[a-(j-i)],c,d);

val(t[a],e,f);

g:=c+e+k;

if g>9 then

begin

k:=1;

g:=g-10;

end

else k:=0;

str(g,v);

insert(v,u,1);

end;

end;

if k>0 then insert('1',u,1);

add:=u;

end;

 

function kiv(s,t:string):string;

var a,b,c,d,e,f,g,i,j,k:integer;

var u,v:string;

 

begin

a:=0;

b:=0;

c:=0;

d:=0;

e:=0;

f:=0;

g:=0;

i:=0;

j:=0;

k:=0;

u:='';

v:='';

i:=length(s);

j:=length(t);

if i>=j then

begin

for a:=i downto 1 do

begin

val(s[a],c,d);

val(t[a-(i-j)],e,f);

g:=c-e-k;

if g<0 then

begin

k:=1;

g:=g+10;

end

else k:=0;

str(g,v);

insert(v,u,1);

end;

end

else

begin

for a:=j downto 1 do

begin

val(s[a-(j-i)],c,d);

val(t[a],e,f);

g:=c-e-k;

if g<0 then

begin

k:=1;

g:=g+10;

end

else k:=0;

str(g,v);

insert(v,u,1);

end;

end;

repeat

if u[1]='0' then delete(u,1,1);

until (u[1]<>'0') or (u='');

if u='' then u:='0';

kiv:=u;

end;

 

function mar(s,t:string):string;

var c,d,e,f,i,j:integer;

begin

if length(s)

If length(s)=length(t) then

begin

for i:=1 to length(s) do

begin

val(s,c,d);

val(t,e,f);

if c

begin

mar:=s;

j:=0;

break;

end

else j:=1;

end;

end;

if j=1 then mar:=kiv(s,szor(oszt(s,t),t));

end;

 

function szor(s,t:string):string;

var w,x:string;

 

begin

w:='0';

x:='0';

if length(s)>length(t) then

begin

repeat

w:=add(s,w);

x:=add(x,'1');

until x=t;

end

else

begin

repeat

w:=add(t,w);

x:=add(x,'1');

until x=s;

end;

szor:=w;

end;

 

function oszt(s,t:string):string;

var x,y:string;

var c,d,e,f,i,j:integer;

 

begin

x:='0';

if length(s)

If length(s)=length(t) then

begin

for i:=1 to length(s) do

begin

val(s,c,d);

val(t,e,f);

if c

begin

j:=1;

break;

end

else j:=0;

end;

end;

if length(s)>length(t) then j:=0;

if j=0 then

begin

repeat

s:=kiv(s,t);

x:=add(x,'1');

If length(s)=length(t) then

begin

for i:=1 to length(s) do

begin

val(s,c,d);

val(t,e,f);

if c

begin

j:=1;

break;

end

else j:=0;

end;

end;

until (length(s)

end;

oszt:=x;

end;

 

function hatv(s,t:string):string;

var y,z:string;

 

begin

y:='1';

z:='0';

repeat

y:=szor(s,y);

z:=add(z,'1');

until z=t;

hatv:=y;

end;

 

end.

NSZ.zip

Link to comment
Share on other sites

Najo.. elkezdtem optmalizálni valamennyire a kódot.. :D

Ja igenm itt azért nem olvasható redesen mert idézetbe írtam és nem kódba)

 

Az új összeadás:

 

function add(s,t:string):string;
var a,b,c,d,g,i,k:integer;
var u,v:string;

begin
a:=0;
b:=0;
c:=0;
d:=0;
g:=0;
i:=0;
k:=0;
u:='';
v:='';

if length(s)<length(t) then i:=length(t) else i:=length(s);
     for a:=i downto 1 do
      begin
       if i=length(s) then
        begin
         val(s[a],b,d);
         val(t[a-(length(s)-length(t))],c,d);
        end
       else
        begin
         val(s[a-(length(t)-length(s))],b,d);
         val(t[a],c,d);
        end;
       g:=b+c+k;
       if g>9 then
        begin
         k:=1;
         g:=g-10;
        end
       else k:=0;
       str(g,v);
       insert(v,u,1);
      end;
if k>0 then insert('1',u,1);
add:=u;
end;

Link to comment
Share on other sites

  • 2 years later...

Én is csinálok most hasonló programit amihez kell a nagy szám csak én magam nak csináltam a programba ojat ami kezeli és nem unite és mellékesen 2 a 200 milliomodik hatványra is emeli de ez még csak az alap lessz az több isxDxD de ha már itt tartok ha írok egy programot mindegy hogy milyen ha van mondjuk egy integer változó benne és valaki nagyobb számot ad meg mint az amennyit bír akkor ugye kilép a program. nincs valami megoldás rá ijen rendesz szintű parancs vagy valami hogy ne zárjun be hanem írja ki hogy nagy és kérdeztessem újra vagy alami? mint a fájl kezelésnél a {$I} vagy mi amivel ugye meg lehet vizsgálni hogy van e hiba a fájl beolvasásánál tehát létezik e vagy nem.

Link to comment
Share on other sites

  • 4 weeks later...
  • 7 years later...

Hello

ha a maximalis szamhoz ami (32 bit) integernel   32767, hozza adsz +1 akkor

tulcsordul es maxilmalis  negativ szam jon ki  ami -32768.

 

Ez alap beilittasnal nem okoz futasi hibat;

 

Be lehet allitani hogy okkozzon:

 

deplhi 10-re

Project -> Options -> DElphi Compiler -> Compiling -> Runtime errors -> Overflow Checking    -> true;

oregeb delphire   Project -> Options -> Compiler ->  Overflow Checking

 

Ebben az estben futas kozben hibakiiras jon letre.

 

Ha a programba akarja kezelni akkor jo a

try
a:=b+c;
except
//hiba eseten ide kerul a vezerles
end
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Hozzászólás a témához...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Jelenleg olvassa   0 members

    • No registered users viewing this page.
×
×
  • Create New...