program dlouha_cisla_scitacka;
{ Tento program obsahuje předevčím sčítačku dvou kladných dlouhých čísel. Jako typ čísla se používá TCislo.
Hlavní program jednoduše testuje naši sčítačku. Vygeneruje si dvě náhodná čísla (dlouhá 0 až MAX cifer),
sečte je a výsledek vypíše.}
const MAX = 300;
type TCifry = array[0..MAX] of 0..9;
TCislo = record
cifry : TCifry; { Na indexu nula je 10^0, na indexu i je 10^i. }
delka : 0..MAX; { Cislo je v poli cifry na indexech 0...delka. }
kladne : boolean;
end;
var A,B,C : TCislo;
i:integer;
{ Sčítá dvě kladná dlouhá čísla typu TCislo. Všechny parametry jsou předávané odkazem - první dva kvůli tomu,
abychom zbytečně neplýtvali pamětí, třetí proto, že v něm bude uložen výsledek. }
procedure scitacka( var A,B,C : TCislo );
var i, prenos : integer;
begin
{ Nejdříve si předpřipravíme proměnnou pro výsledek.
Víme, že výsledek bude kladný. Předpokládejme, že bude tak dlouhý, jako delší ze sčítanců. }
C.kladne:=true;
if (B.delka>A.delka) then
C.delka:=B.delka
else
C.delka:=A.delka;
{ Zde začíná již samotné sčítání. Budeme sčítat cifry od nejnižšího řádu. Do výsledného pole zapíšeme
součet mod 10 a do příště si budeme pamatovat přenos jako součet div 10. }
prenos := 0;
for i:= 0 to C.delka do
begin
C.cifry[i] := (A.cifry[i] + B.cifry[i] + prenos) mod 10;
prenos := (A.cifry[i] + B.cifry[i] + prenos) div 10;
end;
{ Teď jen musíme ošetřit případ, kdy byl nakonci přenos ostře větší jak 0. Pak tento přenos uložíme
do výsledného čísla C a zvětšíme délku čísla C. }
if (prenos>0) then
begin
inc(C.delka);
C.cifry[C.delka]:=prenos;
end;
end;
{ Tato procedura vypisuje kladné dlouhé číslo typu TCislo. }
procedure vypis( var A : TCislo );
var i:integer;
begin
for i:=A.delka downto 0 do
write(A.cifry[i]);
writeln;
end;
begin
{ Pro generování pseudonáhodných čísel používáme příkazy randomize; (připraví náhodný generátor)
a random(x), který vrací pseudonáhodné čísel z rozsahu 0...x-1. }
randomize;
A.kladne:=true; { Naše čísla v tomto ukázkovém příkladu budou vždy kladná. }
A.delka:=random(MAX); { Vygenerujeme náhodnou délku čísla, nejvýše však MAX-1. }
B.kladne:=true;
B.delka:=random(MAX);
for i:=0 to A.delka-1 do { Číslo vyplníme náhodnými ciframi. }
A.cifry[i]:=random(10);
for i:=A.delka+1 to MAX do { Zbytek pole vynulujeme. }
A.cifry[i]:=0;
for i:=0 to B.delka-1 do
B.cifry[i]:=random(10);
for i:=B.delka+1 to MAX do
B.cifry[i]:=0;
A.cifry[A.delka]:=random(9)+1; { Cifra nejvyššího řádu nesmí být nulová. }
B.cifry[B.delka]:=random(9)+1;
vypis(A); { Vygenerovaná čísla si vypíšeme. }
writeln('+');
vypis(B);
writeln('=');
scitacka(A,B,C); { Zde čísla sečteme, výsledek bude uložen v C. }
vypis(C); { Výsledek vypíšeme. }
end.
Kdo byste našel v nějakém z těchto programů chybu, dejte mi to vědět - můžete tak získat bonusové body (1 chyba ≈ 5 bodů). ;)