Cod sursa(job #2023937)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 19 septembrie 2017 18:22:24
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <stdio.h>
#include <string.h>

const int max_cif = 1000005;
class huge
{
    public:

    char cif[max_cif];
    int n;

    void afis()
    {
        for(int i = n-1; i >= 0; i--)
            printf("%d",cif[i]);
        printf("\n");
    }

    void atrib(long long x)
    {
        n = 0;
        while(x > 0)
        {
            cif[n++] = x % 10;
            x /= 10;
        }
    }

    void atribChr(char nr[], int l)
    {
        int i,j;

        n = l;

        for(i = l-1, j=0; i>=0; i--,j++)
            cif[j] = nr[i] - '0';

    }

    void atribHuge(huge x)
    {
        n = x.n;
        for(int i=0; i<n; i++)
            cif[i] = x.cif[i];
    }

    void addHuge(huge x)
    {
        int i, t = 0;

        if(n < x.n)
        {
            for(i=n;i<x.n;i++)
                cif[i] = 0;
            n = x.n;
        }
        else
            for(i=x.n;i<n;i++)
                x.cif[i] = 0;

        for(i=0;i<n;i++)
        {
            cif[i] += x.cif[i] + t;
            t = cif[i] / 10;
            cif[i] %= 10;
        }

        if(t)
            cif[n++] = t;
    }

    void subHuge(huge x)
    {
        int i, t = 0;

        for(i=x.n; i<n; i++)
            x.cif[i] = 0;

        for(i=0; i<n; i++)
        {
            cif[i] -= x.cif[i] + t;

            if(cif[i] < 0)
                t = 1;
            else
                t = 0;

            if(t)
                cif[i] += 10;
        }

        while(cif[n-1] == 0)
            n--;
    }

    void inmHuge(huge x)
    {
        printf("\n\n\nafisaza asta!!!!!!!\n\n");
        printf("\n");
        printf("intrat inm\n");
        long long i,j,t = 0;
        long long prod[max_cif + 1];

        prod[0] = n + x.n - 1;
        for(i=1; i<=prod[0] + 1; i++)
            prod[i] = 0;

        printf("prod = 0\n");


        for(i=0; i<n; i++)
            for(j=0; j<x.n; j++)
                prod[i + j + 1] += cif[i] * x.cif[j];

        printf("termeni adunati!\n");

        for(i=1; i<=prod[0]; i++)
        {
            prod[i] += t;
            t = prod[i] / 10;
            prod[i] %= 10;
        }

        if(t)
            prod[++prod[0]] = t;

        n = prod[0];
        for(i=0;i<n;i++)
            cif[i] = prod[i+1];
    }

    long long div(long long x)
    {
        int i;
        long long R = 0;

        for(i=n-1; i>=0; i--)
        {
            R = 10 * R + cif[i];
            cif[i] = R / x;
            R %= x;
        }

        while(n && cif[n-1] == 0)
            n--;

        return R;
    }
};

FILE *f1 = fopen("next.in","r");
FILE *f2 = fopen("next.out","w");

char nr[max_cif];
long long d, r;
huge n,rez,aux;

int main()
{
    ///citesc valorile
    fscanf(f1,"%s\n%lld",nr, &d);
    n.atribChr(nr, strlen(nr));


    if(n.div(d) == 0)   ///restul este 0
    {
        rez.atribHuge(n);
    }

    else
    {
        rez.atrib(d);

        rez.inmHuge(n);

        aux.atrib(d);
        rez.addHuge(aux);
    }

    for(int i = rez.n-1; i>=0; i--)
        fprintf(f2,"%d",rez.cif[i]);

    return 0;
}