Cod sursa(job #313676)

Utilizator DastasIonescu Vlad Dastas Data 9 mai 2009 16:25:16
Problema Next Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <cstring>

const int maxcif = 1000001;

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

struct bignum
{
    short *nr;

    bignum()
    {
        nr = new short[maxcif];
        for ( int i = 0; i < maxcif; ++i )
            nr[i] = 0;
    }

    short &operator [](int x)
    {
        return nr[x];
    }
};

bignum p;
long long d;

void read()
{
    char buf[maxcif];

    fscanf(in, "%s", buf);
    fscanf(in, "%lld", &d);

    int n = strlen(buf);
    for ( int i = n - 1; i >= 0; --i )
        p[ ++p[0] ] = buf[i] - '0';
}

long long getmod()
{
    long long t = 0;

    for ( int i = p[0]; i > 0; --i )
        t = (t * 10 + p[i]) % d;

    return t;
}

bignum makebig(long long t)
{
    bignum ret;

    while ( t )
    {
        ret[ ++ret[0] ] = t % 10;

        t /= 10;
    }

    return ret;
}

bignum add(bignum x, bignum y)
{
    int s = 0, c = 0;
    bignum ret;

    for ( int i = 1; i <= x[0] || i <= y[0] || c; ++i )
    {
        s = x[i] + y[i] + c;

        ret[ ++ret[0] ] = s % 10;

        c = s / 10;
    }

    return ret;
}

void print(bignum t)
{
    for ( int i = t[0]; i > 0; --i )
        fprintf(out, "%d", t[i]);
}

int main()
{
    read();

    long long diff = d - getmod();

    bignum t = makebig(diff % d);

    print(add(p, t));

    return 0;
}