Cod sursa(job #1720250)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 21 iunie 2016 20:28:31
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 14.8 kb
#include <fstream>

using namespace std;

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

class int_huge
{
public:
    int_huge() {}
    int_huge operator+(int_huge &object)
    {
        int_huge solution,B;
        for(int i=0;i<5010;++i) solution.number[i]=0;
        for(int i=0;i<5010;++i) B.number[i]=0;
        bool ok=false;
        if(this->semn==0 and object.semn==1)
        {
            if(this->number[0]>object.number[0]) ok=true;
            else if(this->number[0]==object.number[0])
                for(int i=this->number[0];i>0;--i)
                {
                    if(this->number[i]>=object.number[i])
                    {
                        ok=true;
                        i=0;
                    }
                    else if(this->number[i]<object.number[i])
                    {
                        ok=false;
                        i=0;
                    }
                }
            if(ok==true)
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    solution.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    B.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
            else
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    B.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    solution.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
        }
        else if(this->semn==1 and object.semn==0)
        {
            if(this->number[0]>object.number[0]) ok=true;
            else if(this->number[0]==object.number[0])
                for(int i=this->number[0];i>0;--i)
                {
                    if(this->number[i]>=object.number[i])
                    {
                        ok=true;
                        i=0;
                    }
                    else if(this->number[i]<object.number[i])
                    {
                        ok=false;
                        i=0;
                    }
                }
            if(ok==true)
            {
                solution.semn=0;
                for(int i=0;i<=object.number[0];++i)
                {
                    solution.number[i]=object.number[i];
                }
                for(int i=0;i<=this->number[0];++i)
                {
                    B.number[i]=this->number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
            else
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    B.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    solution.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
        }
        if(this->semn==1 and object.semn==1)
        {
            solution.semn=1;
            for(int i=0;i<=this->number[0];++i)
            {
                solution.number[i]=this->number[i];
            }
            for(int i=0;i<=object.number[0];++i)
            {
                B.number[i]=object.number[i];
            }
            int j,t=0;
            for(j=1;j<=solution.number[0] or j<=B.number[0] or t;++j,t/=10)
            {
                t+=solution.number[j]+B.number[j];
                solution.number[j]=t%10;
            }
            solution.number[0] = j-1;
            if(solution.number[solution.number[0]]==0)
                solution.semn=1;
            return solution;
        }
        else if(this->semn==0 and object.semn==0)
        {
            solution.semn=0;
            for(int i=0;i<=this->number[0];++i)
            {
                solution.number[i]=this->number[i];
            }
            for(int i=0;i<=object.number[0];++i)
            {
                B.number[i]=object.number[i];
            }
            int j,t=0;
            for(j=1;j<=solution.number[0] or j<=B.number[0] or t;++j,t/=10)
            {
                t+=solution.number[j]+B.number[j];
                solution.number[j]=t%10;
            }
            solution.number[0] = j-1;
            if(solution.number[solution.number[0]]==0)
                solution.semn=1;
            return solution;
        }
    }

    int_huge operator-(int_huge &object)
    {
        int_huge solution,B;
        for(int i=0;i<5010;++i) solution.number[i]=0;
        for(int i=0;i<5010;++i) B.number[i]=0;
        if(this->semn==1 and object.semn==1)
        {
            bool ok=false;
            if(this->number[0]>object.number[0]) ok=true;
            else if(this->number[0]==object.number[0])
                for(int i=this->number[0];i>0;--i)
                {
                    if(this->number[i]>=object.number[i])
                    {
                        ok=true;
                        i=0;
                    }
                    else if(this->number[i]<object.number[i])
                    {
                        ok=false;
                        i=0;
                    }
                }
            if(ok==true)
            {
                solution.semn=1;
                for(int i=0;i<=this->number[0];++i)
                {
                    solution.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    B.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                return solution;
            }
            else
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    B.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    solution.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                return solution;
            }
        }
        else if(this->semn==0 and object.semn==0)
        {
            bool ok=false;
            if(this->number[0]>object.number[0]) ok=true;
            else if(this->number[0]==object.number[0])
                for(int i=this->number[0];i>0;--i)
                {
                    if(this->number[i]>=object.number[i])
                    {
                        ok=true;
                        i=0;
                    }
                    else if(this->number[i]<object.number[i])
                    {
                        ok=false;
                        i=0;
                    }
                }
            if(ok==true)
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    solution.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    B.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
            else
            {
                solution.semn=0;
                for(int i=0;i<=this->number[0];++i)
                {
                    B.number[i]=this->number[i];
                }
                for(int i=0;i<=object.number[0];++i)
                {
                    solution.number[i]=object.number[i];
                }
                int j, t = 0;
                for (j = 1; j <= solution.number[0]; j++) {
                    solution.number[j] -= ((j <= B.number[0]) ? B.number[j] : 0) + t;
                    solution.number[j] += (t = solution.number[j] < 0) * 10;
                }
                for (; solution.number[0] > 1 && !solution.number[solution.number[0]]; solution.number[0]--);
                for(int i=0;i<=solution.number[0];++i)
                {
                    solution.number[i]=solution.number[i];
                }
                if(solution.number[solution.number[0]]==0)
                    solution.semn=1;
                return solution;
            }
        }
        else if(this->semn==0 and object.semn==1)
        {
            solution.semn=0;
            for(int i=0;i<=this->number[0];++i)
            {
                solution.number[i]=this->number[i];
            }
            for(int i=0;i<=object.number[0];++i)
            {
                B.number[i]=object.number[i];
            }
            int j,t=0;
            for(j=1;j<=solution.number[0] or j<=B.number[0] or t;++j,t/=10)
            {
                t+=solution.number[j]+B.number[j];
                solution.number[j]=t%10;
            }
            solution.number[0] = j-1;
            if(solution.number[solution.number[0]]==0)
                solution.semn=1;
            return solution;
        }
        else if(this->semn==1 and object.semn==0)
        {
            solution.semn=1;
            for(int i=0;i<=this->number[0];++i)
            {
                solution.number[i]=this->number[i];
            }
            for(int i=0;i<=object.number[0];++i)
            {
                B.number[i]=object.number[i];
            }
            int j,t=0;
            for(j=1;j<=solution.number[0] or j<=B.number[0] or t;++j,t/=10)
            {
                t+=solution.number[j]+B.number[j];
                solution.number[j]=t%10;
            }
            solution.number[0] = j-1;
            if(solution.number[solution.number[0]]==0)
                solution.semn=1;
            return solution;
        }
    }
    void printNumber();
    void readNumber();
private:
    short number[5010];
    bool semn;
};

void int_huge::printNumber()
{
    if(this->semn==0) out<<"-";
    for(int i=this->number[0];i>0;--i)
    {
        out<<this->number[i];
    }
}

void int_huge::readNumber()
{
    char c;
    c=in.get();
    this->number[0]=0;
    if(c=='-')
    {
        this->semn=0;
        c=in.get();
    }
    else this->semn=1;
    while(c!='\n' and c!=NULL)
    {
        this->number[0]++;
        this->number[this->number[0]]=c-'0';
        c=in.get();
    }
    for(int i=1;i<=this->number[0]/2;++i)
    {
        this->number[i]^=this->number[this->number[0]-i+1]^=this->number[i]^=this->number[this->number[0]-i+1];
    }
}

int main()
{
    int_huge a,b,c;
    a.readNumber();
    b.readNumber();
    (a+b).printNumber();
    return 0;
}