Jump to content
Sign in to follow this  
NemBen

Nagy számok kezelése Stringekkel

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

Téma megosztása


Link to post
Share on other sites

Jó lehet, de nem tudom értelmezni a kódot, mert mindent egymás alá írtál :( Később ezt javítsd és akkor olvashatóbb a kódod és mások is megértik. :) Egyébként szerintem jó :)

Téma megosztása


Link to post
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;

Téma megosztása


Link to post
Share on other sites

Üdv!

 

Volna egy kérésem. Hallotam a "Barátságos számok"-ról. Azt mondják hogy ha ezt megcsinákljuk pascal-ba akkor a gép telejesen belassul, mert ő is lassan tudja kiszámolni.

Valaki megtudja csinálni?

Téma megosztása


Link to post
Share on other sites

Van barátságos számokra is programom. Majd felteszem azt is. :)

De az nagy számokra tényleg nagyon lassú.

Ezt a unitot szerintem nem érdemes hozzá használni, mivel valószínűleg csak lassítaná...

Téma megosztása


Link to post
Share on other sites

É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.

Téma megosztása


Link to post
Share on other sites

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

Téma megosztása


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Jelenleg olvassa   0 members

    No registered users viewing this page.

A letöltési témákba írt köszönetekért és tárhely kérésekért azonnali figyelmeztetés jár!

×