Cod sursa(job #83095)

Utilizator pitbullpitbulll pitbull Data 9 septembrie 2007 23:03:55
Problema Factorial Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.36 kb
# include <stdio.h>
# include <string.h>
# include <math.h>
# include <stdlib.h>

int P,result=0,aux;
int nrdezerodelacoada(int);
int multdeputerede5(int,int);


int main(){
	FILE *in=fopen("fact.in","r");
	fscanf(in,"%d",&P);
	fclose(in);
	
	if(P==0)
		result=1;
	
	while(P>0){
		aux=result;
		if(P==1){
			P--;
			result+=5;
		}
		else if(P==2){
			P--;
			result+=10;
		}
		else if(P==3){
			P-=3;
			result+=15;	
		}	
		
		else {
			result+=20;
			P-=3;
		}
			
		P-=nrdezerodelacoada(result);
		
		P-=multdeputerede5(aux,result);
		
	}		
	
	if(P<0)
		result=-1;
		
	FILE *out=fopen("fact.out","w");
	fprintf(out,"%d",result);
	fclose(out);
	return 0;
}


int nrdezerodelacoada(int nr){
	int i;
	for (i=1;i<=9;i++){//pana la 1 miliard
		int p=pow(10,i);
		if( nr % p )
			return i-1;
		}
	return 0;	
}

int mulde5(int nr){
	int i;
	for (i=1;i<=12;i++){//pana la 1 miliard
		int p=pow(5,i);
		if( nr % p )
			return i-1;
		}
	return 0;	
}

int multdeputerede5(int nr1,int nr2){
	int a;
	float aux1,aux2;
	float res1,res2;
	for (a=1;a<=3;a++){
		aux1=nr1/a;
		aux2=nr2/a;
		
		int aaa=mulde5(nr2);
		if(aaa>1)
			return aaa;
			
		if(aux1==0)
			res1=0;
		else 	
			res1=log(aux1)/log(5);
		
		res2=log(aux2)/log(5);
		
		int pp=res1;
		if(pp && pp+1<=res2)
			return pp;	
	}
	return 0;
}