Cod sursa(job #1855729)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 23 ianuarie 2017 21:30:52
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.66 kb
#include <iostream>
#include <fstream>
#define DigitMax 40

using namespace std;

ifstream fin("adunare.in");
ofstream fout("adunare.out");

string buffer;
string::iterator buffer_it;

int read_int(  ) {
    while ( *buffer_it<'0' || *buffer_it>'9' ) {
        ++buffer_it;
    }
    int x = 0;
    while ( *buffer_it>='0' && *buffer_it<='9' ) {
        x = x*10+*buffer_it-'0';
        ++buffer_it;
    }
    return x;
}

class Huge {
public:
    long long V[1 + DigitMax];

    inline Huge () {
        for(long long i = 0; i < DigitMax; ++i)
            V[i] = 0;
    }

    inline Huge (long long X) {
        *this = X;
    }

    inline Huge operator= (long long X) {
        for(long long i = 0; i < DigitMax; ++i)
            V[i] = 0;
        for(; X; X /= 10)
            V[++V[0]] = X % 10;
        return *this;
    }

    inline Huge operator= (Huge X) {
        for(long long i = 0; i < DigitMax; ++i)
            V[i] = X.V[i];
        return *this;
    }

    friend Huge operator+ (Huge V,Huge X) {
        long long i, T = 0;
        Huge Now;
        for(i = 1; i <= V.V[0] || i <= X.V[0] || T; i++, T /= 10)
            Now.V[i] = (T += V.V[i] + X.V[i]) % 10;
        Now.V[0] = i - 1;
        return Now;
    }
    friend Huge operator+ (Huge A,long long  X) {
        return A + Huge(X);
    }

    friend Huge operator* (Huge V,Huge X) {
        Huge Now;
        long long i, j, T = 0;
        for(i = 1; i <= V.V[0]; i ++) {
            for(j = 1, T = 0; j <= X.V[0] || T; j ++, T /= 10)
                Now.V[i + j - 1] = (T += Now.V[i + j - 1] + V.V[i] * X.V[j]) % 10;
            if(i + j - 2 >= Now.V[0]) Now.V[0] = i + j - 2;
        }
        return Now;
    }

    friend Huge operator* (Huge A,long long  X) {
        return A * Huge(X);
    }

    friend Huge operator- (Huge A,Huge X) {
        long long i, T = 0;
        Huge Now = A;
        for(i = 1; i <= Now.V[0]; i ++) {
            Now.V[i] -= (i <= X.V[0] ? X.V[i] : 0) + T;
            Now.V[i] += (T = Now.V[i] < 0) * 10;
        }
        for(; Now.V[0] > 1 && !Now.V[Now.V[0]]; Now.V[0] --);
        return Now;
    }

    friend Huge operator- (Huge A,long long X) {
        return A - Huge(X);
    }

    friend Huge operator/ (Huge A,long long X) {
        long long i, T = 0;
        Huge Now = A;
        for(i = Now.V[0]; i; i--, T %= X)
            Now.V[i] = (T = T * 10 + Now.V[i]) / X;
        for(; Now.V[0] > 1 && Now.V[Now.V[0]] == 0; Now.V[0] --);
        return Now;
    }

    friend long long operator% (Huge A,long long X) {
        long long i, T = 0;
        for(i = A.V[0]; i; i--)
            T = (T * 10 + A.V[i]) % X;
        return T;
    }

    friend bool operator< (Huge X,Huge Y) {
        long long i,n = X.V[0],m = Y.V[0];
        if(n < m)   return true;
        if(m > n)   return false;
        for(i = n; i && X.V[i] == Y.V[i]; --i);
        if(i==0)    return false;
        if(X.V[i] < Y.V[i])   return true;
        return false;
    }

    friend bool operator<= (Huge X,Huge Y) {
        long long i,n = X.V[0],m = Y.V[0];
        if(n < m)   return true;
        if(m > n)   return false;
        for(i = n; i && X.V[i] == Y.V[i]; --i);
        if(i==0)    return true;
        if(X.V[i] < Y.V[i])   return true;
        return false;
    }
    friend ostream & operator<<(ostream &out, Huge X) {
        for(long long i = X.V[0]; i>0; i--)
            out<<X.V[i];
        return out;
    }
};

int main() {
    Huge a,b;
    getline(fin, buffer, (char)0);
    buffer_it = buffer.begin();
    a = read_int();
    b = read_int();
    fout << a + b;
    return 0;
}