unit highpr; interface const hmax=1000; type number=array [0..hmax] of char; type inp=procedure (var s:string; var k:integer); type hpr=object alap: byte; {a szamrendszer alapszama} elojel: char; {a szam elojele} hossz: word; {a szam hossza} szam: number; {a szam karakterei a legmagasabb...} {helyiertekkel kezdve} end; hpr_arit=object { } { hiba:boolean;} { function siker:boolean;} seged:hpr; function nagyobb(a,b:hpr):boolean; procedure plusz(a,b:hpr;var c:hpr); procedure minusz(a,b:hpr; var c:hpr); procedure szor(a,b:hpr; var c:hpr); procedure oszt(a,b:hpr; var c:hpr); procedure marad(a,b:hpr; var c:hpr); { private} procedure osszead(a,b:hpr; var c:hpr); procedure kivon(a,b:hpr; var c:hpr); end; implementation function hpr_arit.nagyobb(a,b:hpr):boolean; var i:integer; l:boolean; ind:integer; begin if a.hossz=b.hossz then begin i:=a.hossz; while (i>=2) and (a.szam[i]=b.szam[i]) do i:=i-1; l:=a.szam[i]>=b.szam[i]; end else l:=(a.hossz>b.hossz); nagyobb:=l; end; procedure hpr_arit.osszead(a,b:hpr; var c:hpr); var atv,k,s,i:integer; begin atv:=0; for i:=1 to b.hossz do begin s:=(ord(a.szam[i])+ord(b.szam[i])+atv-96); seged.szam[i]:= chr(s MOD a.alap+48); atv:= s DIV a.alap; end; for i:=b.hossz+1 to a.hossz do begin s:=(ord(a.szam[i])+atv-48); seged.szam[i]:=chr(s MOD a.alap+48); atv:= s DIV a.alap; end; k:=a.hossz; if atv=1 then begin k:=k+1; seged.szam[k]:='1'; end; seged.hossz:=k; seged.alap:=a.alap; c:=seged; end; procedure hpr_arit.kivon(a,b:hpr; var c:hpr); var atv,k,s,i:integer; begin atv:=0; for i:=1 to b.hossz do begin s:=(ord(a.szam[i])-ord(b.szam[i])-atv)+10; seged.szam[i]:= chr(s MOD a.alap+48); atv:= 1-s DIV a.alap; end; for i:=b.hossz+1 to a.hossz do begin s:=(ord(a.szam[i])+10-atv-48); seged.szam[i]:=chr(s MOD a.alap+48); atv:= s DIV a.alap; end; k:=a.hossz; if seged.szam[k]='0' then k:=k-1; seged.hossz:=k; seged.alap:=a.alap; c:=seged; end; procedure hpr_arit.plusz(a,b:hpr; var c:hpr); begin if a.elojel=b.elojel then begin {feldolgozas, ha a ket szam} {azonos elojelu} if not nagyobb(a,b) then osszead(b,a,c) else osszead(a,b,c); c.elojel:=a.elojel; end else if (a.elojel='+') and (b.elojel='-') then begin {feldolgozas ha 'a' pozitiv, 'b' negativ} if not nagyobb(a,b) then begin kivon(b,a,c); c.elojel:='-'; end else begin kivon(a,b,c); c.elojel:='+'; end; end else begin {feldolgozas ha 'a' negativ, 'b' pozitiv} if not nagyobb(a,b) then begin kivon(b,a,c); c.elojel:='+'; end else begin kivon(a,b,c); c.elojel:='-'; end; end; end; procedure hpr_arit.minusz(a,b:hpr; var c:hpr); begin if a.elojel=b.elojel then begin {feldolgozas, ha a ket szam} {azonos elojelu} if not nagyobb(a,b) then begin kivon(b,a,c); if a.elojel='+' then c.elojel:='-' else c.elojel:='+'; end else begin kivon(a,b,c); c.elojel:=a.elojel; end; end else begin {feldolgozas ha kulonbozo elojeluek} if not nagyobb(a,b) then osszead(b,a,c) else osszead(a,b,c); c.elojel:=a.elojel; end; end; procedure hpr_arit.szor(a,b:hpr; var c:hpr); var i,j:integer; r:hpr; procedure egy(a:hpr;ch:char; var b:hpr; ind:integer); var i:integer; s:integer; atv:integer; e:byte; begin atv:=0; e:=ord(ch)-48; for i:=1 to a.hossz do begin s:=((ord(a.szam[i])-48)*e)+atv; b.szam[i+ind-1]:=chr(s MOD a.alap+48); atv:=s DIV a.alap; end; b.hossz:=a.hossz+ind-1; b.alap:=a.alap; if atv>0 then begin b.hossz:=b.hossz+1; b.szam[b.hossz]:=chr(atv+48); end; end; begin r.hossz:=1; r.szam[1]:='0'; r.alap:=a.alap; r.elojel:='+'; seged.elojel:='+'; for i:=1 to b.hossz do begin for j:=1 to i-1 do seged.szam[j]:='0'; egy(a,b.szam[i],seged,i); plusz(r,seged,r); end; c:=r; if a.elojel=b.elojel then c.elojel:='+' else c.elojel:='-'; end; procedure hpr_arit.oszt(a,b:hpr; var c:hpr); var r:hpr absolute a; ai,av:integer; i:integer; osz:integer; atv,s:integer; function jo(k,l:integer):boolean; var i,j:integer; begin i:=k; j:=l; if (av-ai+1)=b.hossz then begin while (j>1) and (r.szam[i]=b.szam[j]) do begin j:=j-1; i:=i-1; end; jo:=(b.szam[j]<=r.szam[i]); end else jo:=(av-ai+1)>b.hossz; end; begin ai:=a.hossz-b.hossz+1; { if not jo(a.hossz,b.hossz) then ai:=ai-1;} c.hossz:=ai; av:=a.hossz; if a.hossz0 do begin osz:=0; while jo(av,b.hossz) do begin osz:=osz+1; atv:=0; for i:=1 to b.hossz do begin s:=(ord(r.szam[ai+i-1])-ord(b.szam[i])-atv)+10; r.szam[ai+i-1]:= chr(s MOD a.alap+48); atv:= 1-s DIV a.alap; end; s:=(ord(r.szam[av])+10-atv-48); r.szam[av]:=chr(s MOD a.alap+48); if r.szam[av]='0' then av:=av-1; end; c.szam[ai]:=chr(osz+48); ai:=ai-1; { while (r.szam[av]='0') and (ai>0) do begin c.szam[ai]:='0';ai:=ai-1; av:=av-1; end; } { while not jo(av,b.hossz) and (ai>0) do begin c.szam[i]:='0'; ai:=ai-1; end; } end; c.alap:=a.alap; if a.elojel=b.elojel then c.elojel:='+' else c.elojel:='-'; end; procedure hpr_arit.marad(a,b:hpr; var c:hpr); begin end; begin end.