Cod sursa(job #3122799)

Utilizator AswVwsACamburu Luca AswVwsA Data 20 aprilie 2023 18:21:26
Problema A+B Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.5 kb
#include <fstream>

using namespace std;

struct nod
{
    int val;
    nod *dr;
    nod()
    {
        dr = nullptr;
        val = 0;
    }
};


struct huge
{
    nod *nr = new nod();
    int len;
    huge(string s)
    {
        len = s.size();
        nr->val = s.back() - '0';
        nod *aux = nr;
        for (int i = s.size() - 2; i > -1; i--)
        {
            aux->dr = new nod();
            aux->dr->val = s[i] - '0';

            aux = aux->dr;
        }
    }
    huge()
    {
        nr->val = 0;
    }
};

huge operator +(huge a, huge b)
{
    int tr = 0;
    nod *a1 = a.nr;
    nod *b1 = b.nr;

    int mx = max(a.len, b.len);

    huge c;
    nod *aux = c.nr;
    c.len = mx;
    nod *ax;
    for (int i = 0; i < mx; i++)
    {
        int x, y;
        if (a1 == nullptr)
            x = 0;
        else
            x = a1->val;
        if (b1 == nullptr)
            y = 0;
        else
            y = b1->val;
        int val = tr + x + y;
        aux->val = val % 10;
        tr = val / 10;
        aux->dr = new nod();
        ax = aux;
        aux = aux->dr;

        if (a1)
            a1 = a1->dr;
        if (b1)
            b1 = b1->dr;
    }
    while (tr)
    {
        aux->val = tr % 10;
        aux->dr = new nod();
        ax = aux;
        aux = aux->dr;
        tr /= 10;
    }
    ax->dr = nullptr;
    return c;
}
int cnt;
bool moarte(nod *val)
{
    if (val->dr == nullptr)
        return (val->val == 0);
    bool ok = moarte(val->dr);
    if (ok)
    {
        cnt++;
        val->dr = nullptr;
    }
    return (ok and val->val == 0);
}

huge operator -(huge a, huge b)
{
    huge c;
    nod *aux = c.nr;
    int tr = 0;
    nod *a1 = a.nr;
    nod *b1 = b.nr;
    c.len = a.len;
    nod *ax;
    for (int i = 0; i < a.len; i++)
    {
        int x;
        if (b1 == nullptr)
            x = 0;
        else
            x = b1->val;
        int val = a1->val - x - tr;
        if (val < 0)
        {
            tr = 1;
            val += 10;
        }
        else
            tr = 0;
        aux->val = val;
        aux->dr = new nod();
        ax = aux;
        aux = aux->dr;
        if (b1)
            b1 = b1->dr;
        a1 = a1->dr;
    }
    ax->dr = 0;
    cnt = -1;
    moarte(c.nr);
    c.len -= cnt;
    return c;
}


huge operator *(huge a, huge b)
{
    huge c;
    c.len = a.len + b.len - 1;
    nod *aux = c.nr;
    nod *ax;
    for (int i = 1; i <= c.len; i++)
    {
        aux->dr = new nod();
        ax = aux;
        aux = aux->dr;
    }
    ax->dr = nullptr;

    aux = c.nr;
    for (nod *i = a.nr; i; i = i->dr)
    {
        ax = aux;
        for (nod *j = b.nr; j; j = j->dr, ax = ax->dr)
        {
            ax->val += i->val * j->val;
        }
        aux = aux->dr;
    }

    int t = 0;
    aux = c.nr;
    for (int i = 1; i <= c.len; i++)
    {
        t += aux->val;
        aux->val = t % 10;
        t /= 10;
        ax = aux;
        aux = aux->dr;
    }
    if (t)
    {
        c.len++;
        ax->dr = new nod();
        ax->dr->val = t;
    }
    cnt = 0;
    moarte(c.nr);
    c.len -= cnt;
    return c;
}


void print(nod *nr, ostream& os)
{
    if (nr->dr == nullptr)
    {
        os << nr->val;
        return ;
    }
    print(nr->dr, os);
    os << nr->val;
}
void afis(huge a, ostream& os)
{
    print(a.nr, os);
}

ostream& operator <<(ostream& os, huge a)
{
    afis(a, os);
    return os;
}

int cmp(string a, string b)
{
    if (a.size() != b.size())
        return a.size() - b.size();
    if (a < b)
        return -1;
    if (a > b)
        return 1;
    return 0;
}
int main()
{
    ifstream cin("adunare.in");
    ofstream cout("adunare.out");
   /* cout << "Introdu primul numar:";
    string a;
    cin >> a;
    huge x(a);
    cout << "\nIntrodu al doilea numar:";
    string b;
    cin >> b;
    huge y(b);
    cout << "\nIntrodu operatia:";
    char c;
    cin >> c;
    if (c == '+')
    {
        x = x + y;
        cout << x;
    }
    else if (c == '-')
    {
        if (cmp(a, b) < 0)
        {
            cout << "-";
            swap(x, y);
        }
        x = x - y;
        cout << x;
    }
    else if (c == '*')
    {
        x = x * y;
        cout << x;
    }
    else
        cout << "Operatie invalida!";
    return 0;*/
    string a, b;
    cin >> a >> b;
    huge x(a), y(b);
    x = x + y;
    cout << x;
}