Pagini recente » Cod sursa (job #2839171) | Istoria paginii runda/belele/clasament | Cod sursa (job #1818525) | Cod sursa (job #1948857) | Cod sursa (job #1829337)
#include<fstream>
#include<algorithm>
#include<cstring>
#define DIM 10005
using namespace std;
ifstream fin("adunare.in");
ofstream fout("adunare.out");
/*
clasa pentru numere naturale( cu numar de cifre selectat(DIM) ) cu urmatoarele operatii:
-comparare( <, >, ==, >=, <=, != )
-operatiile cu numere naturale( +, -, *, /, % )
-citire numar
-scriere numar
-initializator automat cu 0
OBS:
- (a - b) returneaza de fapt diferenta in modul a numerelor a si b
- permite inmultire sau impartirea DOAR cu numere naturale
- returneaza DOAR restul unui numar mare la un scalar
*/
class HugeNumber{
private:
int a[DIM];
char numar[DIM];
HugeNumber convert( long long x ){
HugeNumber nr;
if( x == 0 ){
nr[0] = 1;
}
int n = 0;
while( x != 0 ){
nr[++n] = x % 10;
x /= 10;
}
nr[0] = n;
return nr;
}
public:
//constructor
HugeNumber(){
memset( a, 0, sizeof(a) );
a[0] = 1;
}
//
//getteri si setteri
//citire
void read(){
fin >> numar;
int n = strlen(numar);
this->a[0] = n;
for( int i = 0; i < n; i++ ){
this->a[n - i] = (numar[i] - '0');
}
}
//afisare
void write(){
for( int i = a[0]; i >= 1; i-- ){
fout << a[i];
}
}
//at[]
int &operator[]( int poz ){
return this->a[poz];
}
//
//comparator
//<
bool operator<( HugeNumber b ){
if( this->a[0] < b[0] ) return true;
if( this->a[0] > b[0] ) return false;
for( int i = this->a[0]; i >= 1; i-- ){
if( this->a[i] < b[i] ) return true;
if( this->a[i] > b[i] ) return false;
}
return false;
}
bool operator<( long long x ){
HugeNumber b = convert( x );
return ( (*this) < b );
}
//>
bool operator>( HugeNumber b ){
if( this->a[0] > b[0] ) return true;
if( this->a[0] < b[0] ) return false;
for( int i = this->a[0]; i >= 1; i-- ){
if( this->a[i] > b[i] ) return true;
if( this->a[i] < b[i] ) return false;
}
return false;
}
bool operator>( long long x ){
HugeNumber b = convert( x );
return ( (*this) > b );
}
//==
bool operator==( HugeNumber b ){
if( this->a[0] > b[0] ) return false;
if( this->a[0] < b[0] ) return false;
for( int i = this->a[0]; i >= 1; i-- ){
if( this->a[i] > b[i] ) return false;
if( this->a[i] < b[i] ) return false;
}
return true;
}
bool operator==( long long x ){
HugeNumber b = convert( x );
return ( (*this) == b );
}
// !=
bool operator!=( HugeNumber b ){
return !((*this) == b);
}
bool operator!=( long long x ){
HugeNumber b = convert( x );
return ( (*this) != b );
}
//<=
bool operator<=( HugeNumber b ){
if( (*this) < b ) return true;
if( (*this) == b ) return true;
return false;
}
bool operator<=( long long x ){
HugeNumber b = convert( x );
return ( (*this) <= b );
}
//>=
bool operator>=( HugeNumber b ){
if( (*this) > b ) return true;
if( (*this) == b ) return true;
return false;
}
bool operator>=( long long x ){
HugeNumber b = convert( x );
return ( (*this) >= b );
}
//
//OPERATII
//adunare
HugeNumber operator+( HugeNumber b ){
long long t = 0;
HugeNumber r;
r[0] = max( b[0], this->a[0] );
for( int i = 1; i <= r[0]; i++ ){
r[i] = this->a[i] + b[i] + t;
t = r[i] / 10;
r[i] %= 10;
}
while( t != 0 ){
r[++r[0]] = t % 10;
t /= 10;
}
return r;
}
HugeNumber operator+( long long x ){
HugeNumber nr = convert( x );
return ( (*this) + nr );
}
//scadere
HugeNumber operator-( HugeNumber b ){
HugeNumber r = (*this);
int t = 0;
if( r < b ) swap( r, b );
for( int i = 1; i <= r[0]; i++ ){
r[i] = r[i] - ( b[i] + t );
t = ( r[i] < 0 ) ? 1 : 0;
if( t != 0 ) r[i] += 10;
}
while( r[ r[0] ] == 0 ) r[0]--;
return r;
}
HugeNumber operator-( long long x ){
HugeNumber r, b;
b = convert( x );
r = (*this);
return ( r - b );
}
//inmultire
};
int main(){
HugeNumber a, b;
a.read();
b.read();
(a + b).write();
return 0;
}