5 Trieda BigNum
Úloha je za dvojnásobok bodov, preto je na ňu aj viacej času.
Implementujte triedu pre reprezentáciu celého čísla s ľubovoľnou presnosťou. Implementáciu samozrejme nechávam na vás, no nejde mi o efektívnosť implementácie, za to budú až bonusové body . Názov triedy bude BigNum a podporovať nasledovné operácie. Stiahnite si hlavičkový súbor a doplňte do neho implementáciu. Potom odovzdajte iba tento súbor (hlavne tam nedávajte žiadnu funkciu main).
Konštruktory
Konštrukcia bez parametrov (inicializuje číslo na 0)
Konštrukcia z int64_t
Konštrukcia z reťazca (const std::string&), ak reťazec nebude v číselnom formáte (malo by to vedieť spracovať čísla ako -123, +0, 0000, -00012, ...), vyhoďte výnimku. Biele znaky na začiatku a na konci neakceptujeme, teda 456 nie je dobrý vstup.
Podpora kopírovania
Kopírovací konštruktor & operator= (ak vám stačia automaticky generované, tak nemusíte definovať)
Unárne operátory
Unárny operátor + ako vo výraze b = +a;
Unárny operátor - ako vo výraze b = -a;
Binárne aritmetické operátory
Aritmetické operácie -, +, *
Ich +=, *=, -= ekvivalenty
Na násobenie prosím použite trochu lepší algoritmus, ako n-krát spočítam čísla. Stačí aj také násobenie ako učia na základnej škole.
Relačné operátory
Relačné operátory (<, >, <=, >=, ==, !=), pri tomto vám môžu pomôcť funkcie v std::rel_ops.
Podpora streamov
Podporu pre výstup do streamu, teda preťaženie operátora <<
Bonusové body
(2body) Implementáciu /, /=, % a %= (celočíselné delenie) (http://stackoverflow.com/a/5387432)
(1bod) Podpora operátora >> pre vstup zo streamov, vyextrahuje číslo zo streamu pokiaľ sa dá, nastaví failbit ak sa nedá extrahovať ani jeden znak, prípadne ak je na vstupe iba -, vtedy skonzumujeme - a nastavíme failbit. Tu si pozrite ako sa správa int a operátor >>, malo by sa to správať rovnako aj v našej triede. Musíte vyriešiť ako sa správajú neplatné vstupy, napriklad xyz a -xyz.
(1bod) Rýchlosť, tu urobíme pár testov, ktoré testujú násobenie, sčítanie a odčítanie a prvých 5 implementácií získa ďalší bod. Čo urobiť aby vaša implementácia bola rýchla?
Implementácia (ale správna) Karatsubovho násobenia (pre veľké čísla, presne si to treba otestovať, ale povedzme väčšie ako cca. 10100).
Ukladanie čísla nie po 10tkových cifrách, ale po väčších častiach (povedzme int/2)
Ak sa rozhodnete implementovať bonusy, tak príslušné makrá v hlavičkovom súbore nastavte na 1.