Cod sursa(job #38504)

Utilizator astronomyAirinei Adrian astronomy Data 25 martie 2007 20:57:01
Problema Next Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <string.h>

#define MAXC (1 << 20)
#define base 10

typedef int num[MAXC];
typedef long long llong;

num A;
llong D;

void add_one(num A)
{
    int i;

    for(i = 1; A[i] == 9 && i <= A[0]; i++)
        A[i] = 0;
    if(i == A[0]+1)
        A[++A[0]] = 1;
    else
        A[i]++;
}
        
void mul(num A, llong B)
{
    int i;
    llong t = 0;

    for(i = 1; i <= A[0] || t; i++, t /= 10)
        A[i] = (int)((t += B*A[i]) % 10);
    A[0] = i-1;
}

void div(num A, int B)
{
    int i;
    llong t = 0;

    for(i = A[0]; i >= 1; i--, t %= B)
        A[i] = (int)( (t=t*10+A[i])/B );

    for(; !A[A[0]] && A[0] > 1; A[0]--) ;
}

llong rest(num A, int B)
{
    int i;
    llong t = 0;

    for(i = A[0]; i >= 1; i--, t %= B)
        t = t*10+A[i];

    return t;
}


char sir[MAXC];

void ruleaza(void)
{
    int i;
    llong r;

    scanf("%s\n", &sir), A[0] = strlen(sir);
    scanf("%lld\n", &D);
    
    for(i = 1; i <= A[0]; i++)
        A[i] = sir[A[0]-i]-'0';

    r = rest(A, D);

    if(r == 0)
    {
        for(i = A[0]; i >= 1; i--)
            printf("%d", A[i]);
        printf("\n");
    }
    else
    {
        div(A, D), add_one(A), mul(A, D);
        for(i = A[0]; i >= 1; i--)
            printf("%d", A[i]);
        printf("\n");
    }
}

int main(void)
{
    freopen("next.in", "rt", stdin);
    freopen("next.out", "wt", stdout);

    ruleaza();

    return 0;
}