Cod sursa(job #46519)

Utilizator znakeuJurba Andrei znakeu Data 2 aprilie 2007 18:29:59
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <string.h>
int A[1000005],B[1000005];

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

void add()  
{  
    long long 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 invert ()
{
	int i;
	for (i = B[0]; i > 0; i--)
		A[ B[0] - i + 1 ] = B[i];	
	A[0] = B[0];
}

int main()
{

	int x,i;
	long long b=0,a; 
	char c;
	
	FILE *in=fopen("next.in","r");
	x=fscanf(in,"%c",&c);
	while (x!=EOF && c>='0' && c<='9')
	{
		B[ ++B[0] ] = c-'0';
		x=fscanf(in,"%c",&c);
	}
	while (x!=EOF && (c<'0' || c>'9'))
		x=fscanf(in,"%c",&c);
	while (x!=EOF && c>='0' && c<='9')
	{
		b=b*10+c-'0';
		x=fscanf(in,"%c",&c);
	}
	fclose(in);
	
	invert();
	a=mod(b);
	
	if (a)
	{
		a=b-a;
		memset(B,0,1000005);
		while (a)
		{
			B[ ++B[0] ] = a%10;
			a/=10;			
		}
		add();
	}
	
	FILE *out=fopen("next.out","w");
	for (i = A[0]; i > 0; i--)
		fprintf(out,"%d",A[i]);
	fprintf(out,"\n");
	fclose(out);
	return 0;
}