Cod sursa(job #831260)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 8 decembrie 2012 13:04:51
Problema Next Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#include<string.h>

using namespace std;

#define MAXF 1000005

typedef int Huge[ MAXF ];
int i, j, len;
long long int D, r;
Huge a, aux;
char S[ MAXF ];

inline void Add(Huge a, Huge b)
{
    int i, T = 0;

    if(b[0] > a[0])
    {
        for(i = a[0] + 1; i <= b[0]; ++i)
            a[i] = 0;
        a[0] = b[0];
    }

    for(i = 1; i <= a[0]; ++i)
        a[i] += b[i] + T, T = a[i] / 10, a[i] %= 10;

    while(T)
        ++a[0], a[ a[0] ] = T % 10, T /= 10;
}

inline void AtribValue(Huge a, int x)
{
    for(int i = 1; i <= a[0]; ++i)
        a[i] = 0;

    if(!x)
    {
        a[0] = 1;
        return;
    }

    a[0] = 0;
    while(x)
        ++a[0], a[ a[0] ] = x % 10, x /= 10;
}

inline int Divide(Huge a, int x)
{
    int i, r = 0, T = 0;

    for(i = a[0]; i; --i)
    {
        r = 10 * r + a[i];
        a[i] = r / x;
        r %= x;
    }

    while(!a[ a[0] ] && a[0] > 1)
        --a[0];
    return r;
}

int main()
{
    FILE *f = fopen("next.in", "r");

    fgets(S, 1000003, f);
    fscanf(f, "%I64d", &D);

    fclose(f);

    len = strlen(S) - 2;

    a[0] =  aux[0] = len + 1;
    for(i = len, j = 1; i >= 0; --i, ++j)
        a[j] = aux[j] = S[i] - '0';

    r = D - Divide(aux, D);
    AtribValue(aux, r);
    Add(a, aux);

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

    for(i = a[0]; i; --i)
        fprintf(g, "%d", a[i]);

    fprintf(g, "\n");

    fclose(g);

    return 0;
}