Cod sursa(job #46536)

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

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]; i++, t/=10)
		A[i] = (t += A[i] + B[i]) % 10;
	
	while (i<=A[0]  || t)
	{
		A[i] = (t += A[i]) % 10;
		t/=10;
		i++;		
	}
	A[0] = i - 1;  
}  

void invert ()
{
	long long i = 0,t = 0;
	for (i = 1; i <= A[0] / 2; i++)
	{
		t = A[i];
		A[i] = A[ A[0] - i + 1 ];
		A[ A[0] - i + 1 ] = t;
	}
}

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')
	{
		A[ ++A[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;
		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;
}