Cod sursa(job #321903)

Utilizator Abi79Iordache Albert Abi79 Data 7 iunie 2009 18:33:41
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>

FILE *in=fopen("next.in","r"),*out=fopen("next.out","w");

char v1[1000001];
int n[1000001],n2[18];
unsigned long int d;
unsigned long int r;


void init()
{
	long int i;
	
	fscanf(in,"%s\n%d",&v1,&d);
	
	n[0]=strlen(v1);
	
	for(i=1;i<=n[0];i++)
		n[i]=int(v1[n[0]-i])-48;
}


void suma(int A[], int B[])
{ long int i,T=0;

  if (B[0]>A[0])
    { for (i=A[0]+1;i<=B[0];) A[i++]=0;
      A[0]=B[0];
    }
    else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    { A[i]+=B[i]+T;
      T=A[i]/10;
      A[i]%=10;
    }
  if (T) A[++A[0]]=T;
}


void scadere(int A[], int B[])
{ long int i;
	int T=0;

	for (i=B[0]+1;i<=A[0];) B[i++]=0;
	for (i=1;i<=A[0];i++)
	{
		A[i]=A[i]-(B[i]+T);
		if (A[i]<0)
			T=1;
		else
			T=0;
		if (T) A[i]+=10;
	}
	while (!A[A[0]]) A[0]--;
}


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


int main()
{
	long int i;
	init();
	
	r=rest(n,d);
	
	if(!r)
		for(i=n[0];i;i--)
			fprintf(out,"%d",n[i]);
	else
	{
		i=0;
		while(d)
		{
			n2[++i]=d%10;
			d/=10;
		}
		n2[0]=i;
		
		suma(n,n2); //n=n+d
		
		i=0;
		while(r)
		{
			n2[++i]=r%10;
			r/=10;
		}
		n2[0]=i;
		
		scadere(n,n2);
		
		for(i=n[0];i;i--)
			fprintf(out,"%d",n[i]);
	}
	
	fclose(out);
	
	return 0;
}