Cod sursa(job #115154)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 16 decembrie 2007 11:12:36
Problema Multiplu Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasa a 10-a Marime 1.76 kb
# include <stdio.h>

long int nr[10000],len,last=0;
const long int BAZA=10000;
const long int NCFB=4;

long int cmmdc(long int a, long int b)
{
long int r=a%b;
while (r)
	{
	a=b;
	b=r;
	r=a%b;
	}
return b;
}

void check_first()
{
long int w;
last=0;
while (nr[len]>=BAZA)
	{
	nr[len+1]=nr[len]/BAZA;
	nr[len]%=BAZA;
	w=nr[len];
	while (w&&(w%10==1||w%10==0)) w/=10;
	if (w) last=len;
	len++;
	}
w=nr[len];
while (w&&(w%10==1||w%10==0)) w/=10;
if (w) last=len;
}

void check()
{
long int w,i,lc=0;
for (i=1;nr[i]>=BAZA;i++)
	{
	nr[i+1]+=nr[i]/BAZA;
	nr[i]%=BAZA;
	w=nr[i];
	while (w&&(w%10==0||w%10==1)) w/=10;
	if (w) lc=i;
	}
w=nr[i];
while (w&&(w%10==0||w%10==1)) w/=10;
if (w) lc=i;
if (i>len) len=i;
//daca nu am trecut de last-1 inseamna ca nu s-a modificat situatia
//daca am trecut de last-1 inseamna ca last=lc;
if (i>last-1) last=lc;
}


void replicate(long int a)
{
long int step=0;
check_first();
while (last)
	{
	step++;
	if (step>4) step-=4;
	if (step%4==2)
		{
		nr[1]+=4*a;
		check();
		}
	else
		{
		nr[1]+=2*a;
		check();
		}
	}
}

void scrie(long int nr0)
{
long int w,ok=0,ncf;
FILE *g=fopen("multiplu.out","w");
while (len)
	{
	w=nr[len];
	ncf=0;
	if (w==0) ncf=1;
	while (w) {ncf++;w/=10;}
	while (ok&&ncf<NCFB)
		{
		fprintf(g,"0");
		ncf++;
		}
	ok=1;
	fprintf(g,"%ld",nr[len]);
	len--;
	}
while (nr0) {fprintf(g,"0");nr0--;}
fprintf(g,"\n");
}

int main()
{
long int a,b;
FILE *f=fopen("multiplu.in","r");
fscanf(f,"%ld%ld",&a,&b);
a=a*b/cmmdc(a,b);
long int nr2=0,nr5=0,nr0;
while (a%2==0) {nr2++;a/=2;}
while (a%5==0) {nr5++;a/=5;}
if (nr2>=nr5) nr0=nr2;
else nr0=nr5;
//loading the number
nr[1]=a;len=1;
replicate(a);
scrie(nr0);
fcloseall();
return 0;
}