Cod sursa(job #2175621)

Utilizator alex02Grigore Alexandru alex02 Data 16 martie 2018 18:09:05
Problema Sarpe Scor 100
Compilator cpp Status done
Runda like_oji_18_10 Marime 1.98 kb
#include <fstream>
#include <cstring>
#define NMAX 3000
using namespace std;

int i, n, j, cnt;
char sir[NMAX];

ifstream f("sarpe.in");
ofstream g("sarpe.out");

struct huge
{
    int nr;
    int cifre[3000];
}nr, unu, aux, rez, doi, trei, patru, cinci, sase;

huge inmultirevc(huge a, huge b, huge c)
{
    int i, j, T=0;

    c.nr = a.nr + b.nr -1;

    for(i=1;i<=a.nr;i++)
        for(j=1;j<=b.nr;j++)
            c.cifre[i+j-1] += a.cifre[i]*b.cifre[j];

    for(i=1;i<=c.nr;i++)
    {
        c.cifre[i] += T;
        T = c.cifre[i]/10;
        c.cifre[i] = c.cifre[i]%10;
    }

    if(T)
        c.cifre[++c.nr] = T;

    return c;
}

huge scadere(huge a, huge b)
{
    int i,T=0;
    for(i=1;i<=a.nr;i++)
        {
            a.cifre[i]=a.cifre[i] - b.cifre[i] - T;

            if(a.cifre[i]<0)
                T=1;
            else T=0;

            if(T)
                a.cifre[i]+=10;
        }

    while(!a.cifre[a.nr])
        a.nr--;
    return a;
}

huge adunare(huge a, huge b)
{
    int i,T=0;

    for(i=1;i<=a.nr;i++)
    {
        a.cifre[i] = a.cifre[i] + b.cifre[i] + T;

        T = a.cifre[i]/10;

        a.cifre[i] = a.cifre[i] % 10;
    }
    if(T)
        a.cifre[++a.nr]=T;
    return a;
}

int main()
{
    f>>sir;

    n = strlen(sir) - 1;

   for(i=n;i>=0;i--)
        nr.cifre[++cnt] = sir[i] - '0';

    n++;
    nr.nr = n;

    if(n == 1 && nr.cifre[1] == 1)
        g<<"2";
    else if(n == 1 && nr.cifre[1] == 2)
        g<<"8";
    else
    {
        aux.nr = 1;
        aux.cifre[1] = 4;
        unu = inmultirevc(nr, aux, rez);

        aux.cifre[1] = 2;
        doi = scadere(nr, aux);
        aux.cifre[1] =1;
        trei = scadere(nr, aux);
        patru = inmultirevc(doi, trei, rez);
        aux.cifre[1] = 2;
        cinci = inmultirevc(patru, aux, rez);
        sase = adunare(cinci, unu);

        for(i = sase.nr; i>=1; i--)
            g<<sase.cifre[i];
    }
}