Cod sursa(job #321847)

Utilizator Abi79Iordache Albert Abi79 Data 7 iunie 2009 16:40:16
Problema Next Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <string.h>

FILE *f,*s;

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


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, T=0;

  for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
    /* Adica 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]--;
}



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


int main()
{
	long int i,j;
	f=fopen("next.in","r");
	s=fopen("next.out","w");
	
	fgets(v1,1000001,f);
	fscanf(f,"%lld",&d);
	
	n[0]=strlen(v1)-1;
	
	j=1;
	for(i=n[0]-1;i>=0;i--)
	{
		n[j]=v1[i]-48;
		
		j++;
	}	
	
	r=rest(n,d);
	
	i=0;
	while(d)
	{
		n2[++i]=d%10;
		d/=10;
	}
	n2[0]=i;
	
	suma(n,n2);
	
	i=0;
	while(r)
	{
		n2[++i]=r%10;
		r/=10;
	}
	n2[0]=i;
	
	scadere(n,n2);
	
	for(i=n[0];i;i--) fprintf(s,"%d",n[i]);
	
	
	fclose(s);
	
	return 0;
}