Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Algorytmika Programowanie

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

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

0 komentarzy
Inline Feedbacks
View all comments