Cod sursa(job #1829337)

Utilizator robx12lnLinca Robert robx12ln Data 14 decembrie 2016 20:05:17
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.3 kb
#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;
}