Cod sursa(job #238779)

Utilizator DraStiKDragos Oprica DraStiK Data 3 ianuarie 2009 11:51:52
Problema Next Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#define DIM 1000005
#define ll long long
int a[DIM],b[DIM];
int n,d;
ll r;
int maxim (int a,int b)
{
    if (a>b)
        return a;
    else
        return b;
}
ll rest (int a[DIM],ll val)
{
    int i;
    ll t=0;
    for (i=1; i<=a[0]; ++i)
    {
        t=t*10+a[i];
        t%=val;
    }
    return t;
}
void clean (int a[DIM])
{
    int i;
    for (i=1; i<=a[0]; ++i)
        a[i]=0;
    a[0]=0;
}
void aduna (int a[DIM],ll val)
{
    int i,max,t=0;
    b[0]=a[0];
    for (i=1; i<=a[0]; ++i)
        b[b[0]-i+1]=a[i];
    clean (a);
    while (val)
    {
        a[++a[0]]=val%10;
        val/=10;
    }
    max=maxim (a[0],b[0]);
    a[0]=max;
    for (i=1; i<=max; ++i)
    {
        a[i]+=b[i]+t;
		t=a[i]/10;
		a[i]%=10;
    }
    if (t)
    a[++a[0]]=1;
}
void print ()
{
    int i;
    for (i=1; i<=a[0]; ++i)
        printf ("%d",a[a[0]-i+1]);
}
int main ()
{
    freopen ("next.in","r",stdin);
    freopen ("next.out","w",stdout);
    char ch;
	while (scanf ("%c",&ch))
	{
		if(ch=='\n')
        	break;
		a[++n]=ch-'0';
	}
    a[0]=n;
    scanf ("%I64d",&d);
    r=rest (a,d);
    aduna (a,d-r);
    print ();
    return 0;
}