Sunteți pe pagina 1din 0

Numere mari

Consideraii teoretice
Probleme propuse
Soluiile problemelor propuse
Capitolul
10


10.1. Consideraii teoretice
Am ntlnit deja probleme n care eram limitai de modul de reprezentare a numerelor
care conduce la o anumit valoare maxim care poate s fie calculat. Tipic n acest
sens este faptul c nu mai puteam calcula 8! = 40320 dac rezultatul este declarat de
tipul Integer, iar dac ne gndim la tipul LongInt ajungem la o alt limitare rapid
a problemei, i anume 13! = 6227020800. Dar n matematic, cel puin teoretic, am
putea calcula i 1000!, care este deja un numr uria.

Pentru a putea evita aceast limitare putem s reinem un numr foarte mare ntr-un
tablou unidimensional, fiecare component a tabloului primind valoarea anumitei cifre
a numrului respectiv.
ns, nu este destul s memorm cifrele unor astfel de numere, trebuie s putem
executa operaii cu ele. Vom rezolva probleme care presupun adunarea sau nmulirea
a dou astfel de numere mari sau a unui numr mare cu un numr care poate fi repre-
zentat folosind tipurile ntregi standard.
nainte de a rezolva asemenea probleme v prezentm algoritmii generici utili pen-
tru a aduna sau a nmuli numere mari.

Vom studia dou exemple:
Fie numerele a = 467912546316 i b = 5134816297. Ce valoare are a + b?

a 4 6 7 9 1 2 5 4 6 3 1 6
b 5 1 3 4 8 1 6 2 9 7
suma cifrelor 4 6 12 10 4 6 13 5 12 5 10 13
rezultat 4 7 3 0 4 7 3 6 2 6 1 3
114 10. Numere mari

Iat explicaia algoritmului utilizat: pentru fiecare poziie, ncepnd de la dreapta la
stnga (de la cifra unitilor), calculm suma cifrelor de pe poziia respectiv n cele
dou numere. Apoi pstrm n rezultatul adunrii pe poziia respectiv cifra unitilor
din rezultatul obinut i inem minte cifra zecilor. Iniial inem minte 0.
Pentru a putea nelege algoritmul utilizat pentru nmulirea numerelor s explicm
mai nti ce nseamn reprezentarea unui numr pe cifre n baza 10. Fiecare cifr are o
contribuie la numr determinat att de valoarea sa ct i de poziia pe care se afl.
Astfel, numrul 1461 se va putea scrie: 1 10
3
+ 4 10
2
+ 6 10 + 1. Dorim s
nmulim acest numr cu numrul 367, pe care l putem scrie 3 10
2
+ 6 10 + 7. Vom
reine rezultatul calculului ntr-un tablou unidimensional. Observm c, n prima faz
a scrierii, factorul 10
3
de exemplu, se poate obine din urmtoarele contribuii:
1 10
3
7, 4 10
2
6 10, respectiv 6 10 3 10
2
.
Tabelul urmtor ilustreaz modul n care am putea gestiona diferitele produse obi-
nute.

puterile lui 10
6 5 4 3 2 1 0
a
1 4 6 1
b 3 6 7
nmulim toate cifrele lui a cu cifra unitilor lui b (7) 7 28 42 7
nmulim toate cifrele lui a cu cifra zecilor lui b (6) 6 24 36 6
nmulim toate cifrele lui a cu cifra sutelor lui b (3) 3 12 18 3
adunm pe coloane valorile de pe ultimele trei linii
3 18 49 67 48 7
calculm rezultatul final ca i n algoritmul
anterior (pstrm cifra unitilor i inem minte
ceea ce rmne)
5 3 6 1 8 7

Deci, 1461 367 = 536187

Fr nici o dificultate se poate proceda n mod identic pentru numere orict de
mari. Singura limitare o constituie dimensiunea maxim a tablourilor pe care le putem
folosi. Putem utiliza algoritmii prezentai pentru a aduna sau a nmuli chiar i numere
de 10.000 de cifre!

10.2. Probleme propuse

10.2.1. Colonia de bacterii
O colonie de bacterii are o rat foarte mare de nmulire. Fiecare bacterie se divide n
alte dou bacterii dup doar o or. Dup fiecare or, noile bacterii ajunse la maturitate
se divid din nou. Cte bacterii vor exista n colonie dup n ore, tiind c la momentul 0
colonia coninea o singur bacterie.
10. Numere mari 115

Date de intrare
Se d numrul natural n, reprezentnd numrul de ore dup care trebuie s calculm
cte bacterii se afl n colonie.

Date de ieire
Se va afia numrul de bacterii care exist n colonie dup n ore.

Restricii i precizri
2 n 1000.
datele de intrare se consider corecte.

Exemplu
Intrare
n=20
Ieire
1048576

10.2.2. Calculator cu numere mari
Vom citi un numr mare de la tastatur astfel: se d mai nti numrul natural n, repre-
zentnd numrul de cifre al numrului mare, apoi se dau cele n cifre ale numrului
mare, ncepnd cu cifra unitilor. Afiarea numrului mare se va realiza ncepnd cu
cea mai semnificativ cifr a sa.
Scriei un program care preia de la tastatur dou numere mari n modul prezentat
mai sus i calculeaz i afieaz suma i produsul celor dou numere mari conform
algoritmilor prezentai.

Date de intrare
Se d numrul natural n
1
, reprezentnd numrul de cifre ale primului numr mare, apoi
cele n
1
cifre ale numrului. Apoi se d n
2
, reprezentnd numrul de cifre ale celui de al
doilea numr natural i apoi cele n
2
cifre ale celui de-al doilea numr mare.

Date de ieire
Se vor afia suma i produsul celor dou numere date pe dou linii separate.

Restricii i precizri
2 n
1
, n
2
1000.
datele de intrare se consider corecte.

Exemplu
Intrare
n1=10
4 5 5 8 3 2 7 5 6 1
n2=8
7 5 1 8 3 2 7 6
Ieire
1724476711
111429666080304978

Explicaie
Suma
Produsul
Numerele date sunt:
1657238554 i 67238157.
116 10. Numere mari

10.2.3. Factorial extins
Realizai un program capabil s calculeze factorialul oricrui numr natural ntre 2 i
1000.

Date de intrare
Se d numrul natural n.

Date de ieire
Se va afia valoarea calculat a factorialului lui n.

Restricii i precizri
2 n 1000.

Exemplu
Intrare
n=30
Ieire
2432902008176640000

10.3. Soluiile problemelor propuse

10.3.1. Colonia de bacterii
Deoarece numrul de bacterii dup k ore este de dou ori mai mare dect numrul de
bacterii dup k 1 ore, nseamn c, de fapt, dup k ore vom avea 2
k
bacterii. Deci,
pentru n dat, problema cere s determinm 2
n
. Dac n este mai mic dect 16, putem
calcula rezultatul de tip Integer, iar dac n este mai mic dect 32, am putea folosi ti-
pul LongInt. Ce facem ns dac n este egal cu 500? n acest caz avem de calculat
2
500
, care este un numr mult prea mare, deci inevitabil va trebui s folosim reprezen-
tarea rezultatului sub form de numr mare. Pentru un asemenea numr mare va trebui
s fim capabili s realizm nmulirea cu 2.

Iat un exemplu:


Indice 5 4 3 2 1
Numrul iniial 1 6 3 8 4
Calcule
intermediare
2 1 + 1 = 3 2 6 + 0 = 12 2 3 + 1 = 7 2 8 + 0 = 16 2 4 + 0 = 8
Transportul 0 1 0 1 0 0
Rezultat 3 2 7 6 8

10. Numere mari 117

S rspundem la o ultim ntrebare: ct de mare trebuie s fie dimensiunea tablou-
lui pe care l vom utiliza? Iat o estimare: 2
10
10
3
. Deci, 2
1000
10
300
prin urmare, un
ir de 350 de componente va fi cu siguran suficient pentru rezolvarea acestei proble-
me.

10.3.2. Calculator cu numere mari
Problema v cere s implementai algoritmii pentru care am dat exemple n partea de
teorie a acestei lecii. La afiarea rezultatelor renunai la afiarea zerourilor nesemnifi-
cative (zerouri n faa numrului mare care nu au nici o nsemntate).

10.3.3. Factorial extins
Ai putea utiliza un tablou pentru a reprezenta rezultatul sub form de numr mare.
Vei nmuli pe rnd acest tablou cu numere ntre 2 i n. La sfrit va trebui s afiai
rezultatul.

S-ar putea să vă placă și