Cod sursa(job #46587)

Utilizator za_wolfpalianos cristian za_wolf Data 2 aprilie 2007 19:23:49
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
#include<math.h>
int z[1000001],x[1000001];
long long n,m,s,k,t,i,j,l,a;
char c;
/*void inmultire(int A[], int B[])
{
  int i, j, t, C[NR_CIFRE];
	 memset(C, 0, sizeof(C));
	   for (i = 1; i <= A[0]; i++)
	  {
			   for (t=0, j=1; j <= B[0] || t; j++, t/=10)
					  C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
			  if (i + j - 2 > C[0]) C[0] = i + j - 2;
	  }
	  memcpy(A, C, sizeof(C));
} */

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

void scadere(int A[],int B[])
{
	int i,t=0;
	for (i=1;i<=A[0];i++)
		A[i]+=(t=(A[i]-=B[i]+t)<0)*10;
	for (; A[0]>1 && !A[A[0]]; A[0]--);
}

long long rest(int A[], long long B)
{
	long long i,t=0;
	for (i=A[0];i>0;i--)
		t=(t*10+A[i])%B;
	return t;
}


int main()
{
	freopen("next.in","r",stdin);
	freopen("next.out","w",stdout);
	scanf("%c",&c);
	n=0;
	while (c!='\n')
	{
	n++;
	z[n]=c-48;
	scanf("%c",&c);
	}
	scanf("%lld",&k);
	for (i=1;i<=n;i++)
	{
	x[n-i+1]=z[i];
	z[i]=0;
	}
	x[0]=n;
	 if (rest(x,k)==0) for (i=n;i>=1;i--) printf("%d",x[i]); else
	 {

	adunare(z,x);
	l=rest(x,k);
	l=k-l;
	for (i=1;i<=n;i++)
	x[i]=0;
	m=n;
	n=0;
	while (l)
	{
	n++;
	x[n]=l%10;
	l=l/10;
	}
	adunare(z,x);
	if (z[m+1]!=0) m++;
	for (i=m;i>=1;i--)
	printf("%d",z[i]);
	}

	printf("\n");

return 0;
}