Cod sursa(job #472832)

Utilizator bugyBogdan Vlad bugy Data 26 iulie 2010 19:15:50
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
#include<string.h>
using namespace std;
#define dim 1000005 

char v[dim];
long long D;
int n,i,R,a,b,in,DD,nr,N,j;
short int A[dim],B[dim],ok,k;
int main()
{
	FILE *f=fopen("next.in","r"), *g=fopen("next.out","w");

fscanf(f,"%s",v);
fscanf(f,"%lld",&D);
 if(D==1)
	{fprintf(g,"%s\n",v);fclose(f);
fclose(g);
return 0;}
	
DD=D;
while(DD!=0)
{
nr++; DD/=10;
}

n=strlen(v);
for(i=0;i<n;i++)
	A[i+1]=v[i]-48;
memcpy(B,A,sizeof(B));

ok=1;
if(n<nr)
	ok=0;
in=1; N=n;



while(ok)
{	
a=A[in];
for(i=in+1;i<=in+nr-1;i++)
	{a*=10; a+=A[i];}
k=0;
if(a<D)
	{a*=10; a+=A[in+nr]; k=1;}
b=a;
a/=D;
a*=D;
b-=a;
for(i=in+nr-1+k;i>=in;i--)
{
	A[i]=b%10;
	b/=10;
}
for(i=1;i<=N;i++)
	if(A[i]!=0)
	{
	in=i; n=N-i+1; break;
	}
	

if(n<nr)
	ok=0;	
else if(n==nr)
{ b=0;
	for(i=1;i<=N;i++)
		if(A[i]!=0)
			{b=A[i]; j=i; break;}
			
	for(i=j+1;i<=N;i++)
		if(A[i]!=0)
		{
			b*=10; b+=A[i];
		}		
if(b<D)
	ok=0;
	
}
}
	
//restul

R=A[in];

for(i=in+1;i<=N;i++)
	{R*=10; R+=A[i];}
	
DD=(D-R)%D;
i=0;
while(DD!=0)
{
	B[N-i]+=DD%10;
	if(B[N-i]>9)
		{B[N-i]%=10;
		B[N-i-1]++;}
	
	DD/=10;
	i++;
}
for(i=1;i<=N;i++)
	fprintf(g,"%d",B[i]);

fprintf(g,"\n");



fclose(f);
fclose(g);
return 0;
}