Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Introducere ................................................................................... 3 Reprezentarea numerelor mari ................................................... 4 Citirea unui numr mare ............................................................ 5 Afiarea unui numr mare .......................................................... 6 Compararea a dou numere mari ............................................... 7 Suma a dou numere mari .......................................................... 8 Diferena a dou numere mari .................................................... 9 Produsul dintre un numr mare i o putere a lui 10 ............... 10 Produsul dintre un numr mare i un numr mic ................... 11 Produsul a dou numere mari .................................................. 12 mprirea dintre un numr mare i o putere a lui 10............. 13 mprirea dintre un numr mare i un numr mic ................ 14 mprirea a dou numere mari................................................ 15 Probleme ..................................................................................... 16 Legturi ...................................................................................... 16 Bibliografie................................................................................. 16
Introducere
Dac ntr-o problem avem nevoie s lucrm cu numere naturale mai mari dect 264 nu putem folosi niciunul dintre tipurile de date predefinite ale limbajului C/C++. Tipurile de date cele mai mari ale limbajului C/C++ sunt cele pe 8 bytes (octei): long long care poate reine valori n intervalul [ 9.223.372.036.854.775.808 , 9.223.372.036.854.775.807 ] = [263 , 263 1] unsigned long long care poate reine valori n intervalul [ 0 , 18.446.744.073.709.551.615 ] = [0, 264 1]. Prin urmare, trebuie s implementm propriul nostru tip de date pentru numere mari precum i funciile care s realizeze operaiile (comparare, adunare, scdere, nmulire, mprire) cu astfel de numere mari.
4 3 2 1 Observaii: Se observ faptul c indicele poziiei din vector al oricrei cifre coincide cu puterea bazei corespunztoare acelei cifre. S considerm c numerele mari cu care vom lucra n continuare au maxim 100 de cifre. Declararea unui astfel de numr mare este:
char NrMare[DIMMAX];
Observaii: DIMMAX este o constant creia i-a fost atribuit valoarea 100 reprezentnd numrul maxim de cifre al unui numr mare. Tipul elementelor vectorului este char deoarece n fiecare poziie a vectorului va fi memorat o cifr (dac am fi folosit tipul int sau alt tip care s necesite mai mult de 1 byte am fi irosit memoria).
Observaii: Deoarece elementele vectorului sunt de tipul char, dac am afia cifrele numrului mare astfel:
cout << a[i];
atunci cifrele ar fi fost considerate coduri ASCII i ar fi fost afiate caracterele corespunztoare. De aceea trebuie s facem conversia explicit de tip
(int) a[i]
Observaii: Suma ar putea avea o cifr n plus fa de cel mai mare dintre numere (dac la sfritul adunrii cifra de transport este nenul). Din aceast cauz, trebuie s declarm vectorul suma cu un element n plus fata de maximul dintre numarul de elemente ale numerelor pe care vrem s le adunm (dac vectorii a i b au fost declarai ca avnd DIMMAX elemente, atunci vectorul suma trebuie s aiba DIMMAX + 1 elemente). Pentru c la citirea unui numr mare am completat elemente vectorului care nu au fost ocupate de cifrele numrului mare cu valoarea 0 putem efectua fr grija alterrii rezultatului adunarea cifr cu cifr chiar dac cele dou numere au lungimi diferite. Exemplu: Suma dintre numerele = 1234 i = 9999 va arta astfel:
0 1 2 3 4
a 4 3 2 1 0 b 9 9 9 9 0 a+b 3 3 2 1 1 8
a 4 3 2 1 0 0 0 103 0 0 0 4 3 2 1
10
Observaii: i la acest tip de nmulire (ca i la nmulirea a dou numere mari) trebuie s avem grij la declararea dimensiunii vectorului rezultat (care va fi aleas n funcie de mrimea numrului mic).
11
Observaii: Lungimea maxim a produsului este egala cu suma lungimilor celor doi termeni pe care i nmulim. Dac cei doi termeni ocup n totalitate toate poziiile vectorului (adica au DIMMAX cifre) atunci produsul nostru poate avea DIMMAX * 2 cifre. Aadar, i la nmulire (ca i la adunare) trebuie s avem grij la declararea dimensiunii vectorului rezultat.
12
a 4 3 2 1 ct 1 0 0 0 rest 234
13
14
Observaii: S-a folosit funcia copie(char a[], int lga, char b[], int &lgb) care copie element cu element vectorul a n vectorul b i actualizeaz numrul de cifre ale vectorului b.
15
Probleme
Set (Campion) Sqr (Campion) Numar3 (Campion) Banda10 (Campion) Dale (Campion) Patrate2 (Infoarena) Pomi (Campion) Muguri (Campion) Test (Campion) Cutii (Campion) Aliniere (Campion) Aladdin2 (Infoarena) Biti2 (Infoarena) Petrecere (Campion) Fib (Campion) Sumb (Campion) Cos (Campion) Next (Infoarena) Tort (Infoarena) Culori3 (Infoarena)
Legturi
Ali algoritmi care pot fi folosii pentru nmulirea a dou numere mari: Algoritmul Karatsuba Algoritmul Toom - Cook
Bibliografie
Emanuela Cerchez, Marinel erban, Programarea n limbajul C/C++ pentru liceu volumul III, Editura Polirom, Iai, 2006