Suma numerelor mari

Suma a doua numere mari

Pentru a calcula suma dintre două numere mari vom parcurge simultan cele două numere, începând cu cifra unităților(cifra memorată în poziția 0). Vom aduna cele două cifre aflate pe poziții corespondente și vom lua în calcul si o eventuală cifră de transport, care s-a obținut la adunarea precedentă( bineînțeles că, inițial cifra de transport este 0). Vom memora în sumă doar ultima cifră a rezultatului adunării dintre cele două cifre(a[i]+b[i]) și cifra de transport - restul împărțirii adunării la 10-și vom reactualiza transportul( câtul împărțirii rezultatului adunării celor două cifre si transport la 10).

Funcția aduna() va avea șase parametri:

    • primul număr a: char a[]; //transmis prin referință, fiind o constantă pointer la primul caracter din șir

    • numărul de cifre din primul număr: int lga; //transmis prin valoare

    • al doilea număr b: char b[]; //transmis prin referință, fiind o constantă pointer la primul caracter din șir

    • numărul de cifre din cel de-al doilea număr: int lgb; //transmis prin valoare

    • numarul obțiut în urma adunării a+b: char suma[]; //transmis prin referință, fiind o constantă pointer la primul caracter din șir,

    • numărul de cifre al rezultatului: int &lgs; //transmis prin referință, el se va modifica în această funcție

//suma a doua numere mari

void aduna(char a[],int lga,char b[],int lgb,char suma[],int &lgs)

{

int i, t=0;

//initializez lungimea vectorului suma, lgs, cu maximul dintre

//lungimile celor doua numere

lgs=max(lga,lgb);

//adunam cifra cu cifra cele doua numere si nu uitam de transportul

//cifrei din rangul anterior

for(i=0;i<lgs;++i)

{

suma[i]=a[i]+b[i]+t;

t=suma[i]/10; //transportul pentru urmatoarea adunare

suma[i]=suma[i]%10; //pastram doar ultima cifra a sumei

}

//daca la sfarsit avem transport diferit de zero il adagam la suma

if(t)

suma[lgs++]=t;

}

Observații:

    • rezultatul adunării celor două numere mari, ar putea avea o cifră în plus față de cel mai mare număr(dacă la sfârșitul adunării cifra de transport nu este nulă).

    • deoarece la citirea numerelor am competat cu zero toate elementele vectorului care nu au fost ocupate de cifrele numărul mare, putem aduna cele două numere fără grija alterării rezultatului chiar dacă au lungimi diferite.

Exemplu: cel mai defavorabil caz este adunarea a=9999 și b=999 atunci, suma va fi numărul a+b=10998

:

Apel:

aduna(a,lga,b,lgb,c,lgc);

cout<<"Suma este: "<<endl;

afisare(c,lgc);