Cod sursa(job #312182)

Utilizator indestructiblecont de teste indestructible Data 5 mai 2009 12:26:35
Problema Next Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <string.h>
#define N 1000005
char s[N];
int v[N],r;
long long d;
void citire()
{
	int t;
	fgets(s+1,N,stdin);
	t=(int)strlen(s+1);
	int i;
	for (i=t; i>=1; i--)
	{
		if ((s[i]-'0')>=0 && (s[i]-'0')<=9)
			v[++r]=s[i]-'0';
	}
	v[0]=t;
	scanf("%lld",&d);
}
long long mod(int A[],long long B)
{
      int i;
      long long t = 0;
      for (i = A[0]; i > 0; i--)
              t = (t * 10 + A[i]) % B;
      return t;
}
void mul(int A[], long long B)
{
      int i;
	  long long	t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}
void add(int A[])
{
      int i, t = 0;
      for (i=1; i<=A[0] || i<=1 || t; i++, t/=10)
              A[i] = (t += A[i] + 1) % 10;
      A[0] = i - 1;
}

void div(int A[], long long B)
{
      int i; 
	  long long t = 0;
      for (i = A[0]; i > 0; i--, t %= B)
              A[i] = (t = t * 10 + A[i]) / B;
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void rezolva()
{
	if (mod(v,d)==0)
		printf("%s\n",s+1);
	else
	{
		div(v,d);
		add(v);
		mul(v,d);
		for (int i=v[0]; i>=1; i--)
			printf("%d",v[i]);
	}
}
int main()
{
	freopen("next.in","r",stdin);
	freopen("next.out","w",stdout);
	citire();
	rezolva();
	return 0;
}