Dodawanie dowolnie dużych liczb całkowitych [C++]

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2012-12-07) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

Algorytm dodawania zrealizowany w C++. Wartości do dodawania przechowywane są w plikach tekstowych. Wynik wyświetlany na ekranie.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int getSize(ifstream&);

int main(){
ifstream a,b;
a.open( "a.txt" );//otwieram plik z 1 liczba
b.open( "b.txt" );//otwieram plik z 2 liczba
int a_size = getSize(a)-1; //ucinam dlugosc o 1 (indeksacja od 0)
int b_size = getSize(b)-1; //jw

int max = a_size;
if(max<b_size)
max= b_size;
//wybralem dluzsza
char* aa = new char[a_size+1];
char* bb = new char[b_size+1];//alokuje pamiec
aa[0]='\0';
bb[0]='\0';
a.read(aa, a_size+1);//czytam pliki
b.read(bb, b_size+1);

char* wynik = new char[max+2];//alokacja pamieci dla wynik
wynik[0]='\0';
int prop=0;//flaga propagacji
while(max+1){
if(a_size<0){//jesli jedna z liczb jest krotsza od drugiej
wynik[max]=bb[b_size];
max--;
b_size--;
continue;
}
if(b_size < 0){//jw
wynik[max]=aa[a_size];
max--;
a_size--;
continue;
}

if((aa[a_size]-'0')+(bb[b_size]-'0')+prop>9)//jesli bedzie propagacja
{

if(prop)//jesli byla z poprzedniej operacji
wynik[max] = ((aa[a_size]-'0')+(bb[b_size]-'0'+1)-10)+'0';
else//jesli nie
wynik[max] = ((aa[a_size]-'0')+(bb[b_size]-'0')-10)+'0';
}
else//jeslinie bedzie propagacji
{
if(prop)//jesli byla z poprzedniej operacji
wynik[max] = ((aa[a_size]-'0')+(bb[b_size]-'0'+1)+'0');
else//jesli nie
wynik[max] = ((aa[a_size]-'0')+(bb[b_size]-'0')+'0');
}

if((aa[a_size]-'0')+(bb[b_size]-'0')+prop>9)//jesli jest propagacja w tym kroku to ja ustawiam
prop=1;
else
prop=0;

a_size--;//zmiejszam, czyli przechodze do kolejnej cyfry
b_size--;
max--;
if((max==0) and prop==1){//obsluga przeniesienia jesli jest na najstaszej pozycji

wynik[max] ='0'+1;
}
if((max==0) and prop==0){

wynik[max] =32;
}
}
cout<<aa<<" + "<<bb<<" = "<<wynik<<endl;//pokazuje wynik
delete [] wynik;
delete [] aa;
delete [] bb;//zwalniam pamiec
return 0;
}
int getSize(ifstream& a){
a.seekg (0, ios::beg);
int begin = a.tellg();
a.seekg (0, ios::end);
int end = a.tellg();
int size = end-begin-1;
a.seekg (0, ios::beg);
return size;
}
Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

Ostatnie wpisy

Podsumowanie: luty i marzec 2024

Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More

7 dni ago

Podsumowanie: styczeń 2024

Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More

2 miesiące ago

Podsumowanie roku 2023

Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More

3 miesiące ago

Podsumowanie: grudzień 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More

4 miesiące ago

Praca zdalna – co z nią dalej?

Cześć, ostatnio w Internecie pojawiło się dużo artykułów, które nie były przychylne pracy zdalnej. Z drugiej strony większość komentarzy pod… Read More

4 miesiące ago

Podsumowanie: listopad 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W listopadzie dokończyłem cykl "Z mgły zrodzony" Sandersona. Tylko "Stop prawa" mi nie do… Read More

5 miesięcy ago