Documente Academic
Documente Profesional
Documente Cultură
Nrmari PDF
Nrmari PDF
Noiembrie 2013
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];
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
a 4 3 2 1 0
b 9 9 9 9 0
a+b 3 3 2 1 1
8
Exemplu:
Produsul dintre numrul = 1234 i 103 va arta astfel:
0
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
Exemplu:
Rezultatul mpririi numrului = 1234 la 103 va arta astfel:
0
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
Alexandru Cohal
alexandru.cohal@yahoo.com
alexandru.c04@gmail.com
Noiembrie 2013
16