Cod sursa(job #37471)

Utilizator slayer4uVictor Popescu slayer4u Data 25 martie 2007 10:13:42
Problema Next Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 9-a si gimnaziu Marime 1.24 kb
#include<stdio.h>
#include<string.h>

char s[1000010];
int d;
int n[1000010],o[1000010],l[1000010],k,i,one[]={1,1};

void add(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 div(int A[], int B)
{
      int i, 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 mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}

void print(int x[])
{
	for (int i=x[0];i>=1;i--)
		printf("%ld",x[i]);
	printf("\n");
}
int comp(int a[], int b[])
{
	if (a[0]!=b[0]) return -1;
	for (int i=1;i<=a[0];i++)
		if (a[i]!=b[i]) return -1;
	return 0;
}

int main()
{
	freopen ("next.in","rt",stdin);
	freopen ("next.out","wt",stdout);
	scanf("%s",&s);
	scanf("%ld",&d);
	k=strlen(s);
	n[0]=k;
	l[0]=k;
	for (i=k-1;i>=0;i--)
		n[k-i]=s[i]-'0',l[k-i]=s[i]-'0';

	div(l,d);
	for (i=0;i<=l[0];i++)
		o[i]=l[i];
	mul(l,d);
	if (comp(l,n)==0)
		print(n);
	else
	{
		add(o,one);
		mul(o,d);
		print(o);
	}
	return 0;
}