Cod sursa(job #176175)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 10 aprilie 2008 20:24:02
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define NMAX 1000UL
#define STRTO  strtoull
#define	NMAX	1000100UL
#define LMAX	18

unsigned long long v10[21]={0};

void p_zece()
{
int i;
unsigned long long p10=1;
for(i=0;i<21;i++){
	v10[i]=p10;
	p10*=10;
	}
}

int nrcifre(unsigned long long x)
{
int i;
for(i=1;i<20;i++){
	if(x<v10[i]) break;
	}
return i;
}

char *suma(char *p, char *q)
{
char *t,*z;
int lp,lq,i,carry,k,j;
lp=strlen(p);
lq=strlen(q);
if(lp<lq) {t=p;p=q;q=t;}
lp=strlen(p);
lq=strlen(q);
carry=0;k=0;
z=p+lp-1;
for(j=lq-1;j>=0;j--){
	*z=*(z)-48+*(q+lq-k-1)+carry;
	if(*z>48+9) {carry=1;*z-=10;}
	else carry=0;
	k++;
	z--;
	}

while(carry&&lp-k>0){
	*z=*(z)+carry;
	if(*z>48+9) {carry=1;*z-=10;}
	else carry=0;
	k++;
	z--;
	}
if(carry){p--;*p='1';}
return p;
}

int main()
{
unsigned long long n,d,m,c,r,l,i,ncc;
char s[NMAX+1],x[31],xt[31],*end,*p,*finish,*sc;
int ld,lung,lr,carry,pc;
freopen("next.in","r",stdin);
freopen("next.out","w",stdout);
sc=s+50;
scanf("%s",sc);
scanf("%llu",&d);
p_zece();
//i=1000;
/*
while(i<2001)
{
printf("%-10llu",i);
ultoa(i,sc,10); */
l=strlen(sc);
ld=nrcifre(d);

if(ld>l) printf("%llu",d);
else
	if(l<=LMAX){
		n=STRTO(sc,&end,10);
		c=n/d;r=n%d;
		if(r) c++;
		m=c*d;
		printf("%llu",m);
		}
	else
		{
		finish=sc+l;
		p=sc;
		lung=LMAX;
		r=0;
		while(p<finish){
			strncpy(x,p,lung);
			if(lung>finish-p) lung=finish-p;
			x[lung]='\0';
			p+=lung;
			n=STRTO(x,&end,10);
			r*=v10[lung];
			n+=r;
			r=n%d;
			lr=nrcifre(r);
			lung=LMAX-lr+1;
			}
	n=d-r;
//	printf("%llu %llu %d  ",r,n,lr);
	if(r)
	{
	sprintf(x,"%llu",n);
	p=suma(sc,x);
	}
	else p=sc;
	printf("%s",p);
	}
/*i++;
} */
return 0;
}


/*for(i=1;i<=2000000000;i=10*i)
	{ld=nrcifre(i);
	printf("%llu %d\n",i,ld);
	}  */