Cod sursa(job #175550)

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

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;
}

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();
l=strlen(sc);
ld=nrcifre(d);

if(ld>l) printf("%llu",d);
else
	if(l<=18){
		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=18;
		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=18-lr+1;
			}
		lr=nrcifre(r);
		p=finish-ld+1;
		strcpy(x,p);
		n=STRTO(x,&end,10);
	//printf("%llu %llu %d\n",r,n,lr);
	if(r)
	{
	n=n+d;
	n=n-r;
	sprintf(x,"%llu",n);
	carry=0;
	if(nrcifre(n)>lr){
		strcpy(xt,x+1);
		strcpy(p,xt);
		ncc=strlen(p);
		carry=*x-48;p--;ncc++;
		while(carry){
			pc=*p-48;
			pc=pc+carry;
			if(pc>9)
				{
				if(ncc==l+1) *p=0;
				pc=pc%10;carry=1;*p=pc+48;p--;ncc++;
				if(ncc==l+1) *p='0';
				}
			else {*p=pc+48;carry=0;}
			}
		if(ncc>l) p=sc-1;
		else p=sc;
		}
	else strcpy(p,x);
	}
	printf("%s",p);
	}
return 0;
}


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