NézetNyomtat

2. óra
Címkék > Óra

2. óra

Továbbra is nagy egészekkel foglalkozunk. Elkezdjük a nagypontosságú aritmetikát megvalósító modul megírását. A következő feladat csak kiinduló pont, több szakkör alatt áll össze a megoldás.

Feladat

A megoldás matematikája

Első észrevétel

Ha $T~|~t_1+X$ és $T~|~t_2+X$, akkor $T~|~(t_1+X)-(t_2+X)=t_1-t_2$. Ebből következik, hogy van felső korlát T-re, értelmes a kérdés.

Második észrevétel

Ha $T~|~t_1-t_2$ és $T~|~t_2-t_3$, akkor $T~|~(t_1-t_2)+(t_2-t_3)=t_1-t_3$. Ebből következik, hogy a maximális T a szomszédos $t_i$-k különbségének legnagyobb közös osztója.

Tehát amire szükségünk van...

Ki kell tudnunk számolni tehát nagy számok legnagyobb közös osztóját. Ismert, hogy a prímfelbontáson alapuló algoritmus nagy egészekre nem elég gyors, ezért az euklideszi algoritmussal dolgozunk. El kell tudnunk végezni az alapműveleteket nagy számokon.

Nagy számok ábrázolása

A nagy számok számjegyeit (tízes számrendszer) egy tömbben tároljuk, és feljegyezzük még azt, hogy hány jegyű a szám.

Pascal példa

type nagyszam = record 
            jegy : array[0..100] of byte; 
            h : byte; 
        end;
A jegy[0] az egyesek helyén álló jegy, a jegy[1] a tízesek helyén álló, és így tovább. Az utolsó jegy indexe h-1.

Első lépések egy nagypontosságú aritmetikai modul megvalósítása felé

Érdemes végiggondolni, milyen metódusokra lesz szükségünk.

Konstruktorok

  • Nagy egész létrehozása 32-bites vagy 64-bites egészből
  • Nagy egész létrehozása karakterláncból

Megjelenítés

  • Nagy egész kiírása képernyőre

Relációk

  • Nagy egész összehasonlítása 0-val
  • Két nagy egész összehasonlítása

Operátorok

  • összeadás
  • kivonás
  • szorzás
  • maradékos osztás

Egy első próbálkozás, még objektumok nélkül