3. Jednosmerný lineárny zoznam

3.8  Problém - Súčet veľkých prirodzených čísel

   Napíšte program, ktorý umožní sčítať dve ľubovoľne veľké prirodzené čísla, ktoré môžete načítať aj zo vstupného súboru. Výstupom programu bude výpis súčtu na obrazovku.


Riešenie

Možno ste si práve pomysleli: "Sčitať dve prirodzené čísla predsa nie je žiadny problém!" To skutočne nie je, pokiaľ nepotrebujeme sčítať také dve prirozené čísla, ktoré sú väčšie ako maximálna možná hodnota použitého údajového typu (napr. long), prípadne oba sčítance síce sú s dovoleného rozsahu, avšak príslušný súčet už nie.

Chceme sčítať dve čísla, ktorých počet cifier nie je vopred známy ani ničím obmedzený (azda len kapacitou pamäte :-) Preto využijeme pri riešení dynamickú údajovú štruktúru a veľké prirodzené číslo budeme reprezentovať linárnym zoznamom svojich číslic.

Tento lineárny zoznam bude tvorený prvkami typu TUzol :

typedef struct uzol {
   int cifra;
   struct uzol *dalsi;
} TUzol;
Pri výpočte použijeme tri lineárne zoznamy - pre dva sčítance a výsledný súčet:

TUzol *a, *b, *sucet;

Pre potreby sčítania je vhodné použiť takú orientáciu zoznamu, aby na jeho začiatku bola číslica najnižšieho rádu. Čísla načítame cifru po cifre zo vstupných textových súborov, pričom každú novú cifru pridáme na začiatok príslušného zoznamu - to znamená, že cifry budú v zozname uložené v opačnom poradí ako na vstupe.

Ak by na vstupe boli čísla:

A = 1234567890
B =  904246128

vytvorené zoznamy budú vyzerať takto:



Pri sčítovaní čísel využijeme bežný postup známy zo základnej školy:



Na zapamätanie prenosu z nižšieho do vyššieho rádu budeme potrebovať pomocnú premennú.

Zoznam, v prvkoch ktorého si uložíme číslice výsledného súčtu, vytvárame postupne pri sčitovaní. Vzhľadom na to, že pri sčitovaní postupujeme od najnižšieho rádu a každú ďalšiu získanú cifru súčtu pridáme na začiatok zoznamu, po skončení výpočtu budú cifry výsledku v "správnom" poradí.

Nesmieme tiež zabudnúť na to, že čísla nemusia mať rovnaký počet cifier!

Číslice súčtu budú na konci uložené v lineárnom zozname:



Stačí už len vypísať prvky zoznamu na obrazovku.

[Program]