Cod sursa(job #314640)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 12 mai 2009 12:02:52
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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 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()
{
	int i,q,q_ant;
	if (mod(v,d)==0)
		printf("%s\n",s+1);
	else
	{
		div(v,d);
		q=(v[1]+1)/10;
		v[1]=(v[1]+1)%10;
		q_ant=q;
		for (i=2; i<=v[0] || q; i++)
		{
			q=(v[i]+q)/10;
			v[i]=(v[i]+q_ant)%10;
			q_ant=q;
			if (i==v[0]+1)
			{
				v[0]+=1;
				break;
			}
		}
		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;
}