Cod sursa(job #22521)

Utilizator gennhuTari Gergo-Zsolt gennhu Data 26 februarie 2007 19:34:13
Problema Factorial Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<fstream.h>
const long h[] ={0,5,25,125,625,3125,15625,78125,390625,1953125,9762625,5*9762625      ,25*9762625};
const long h2[]={0,1,6, 31, 156, 781, 3906,19531, 97656, 488281,2441406,2441406+9762625,2441406+9762625+5*9762625};
			long neww[12]={0};
long   a,b,i,j,k,l,m,n,n2,p=0;


int loofasz(long& ertek) {
 int i,j=0;
 i=0;j=0;
	do {
	 i++;
	 if (p==h2[i]) {neww[i+1]=1;ertek=0;return i;}}
	while (p>h2[i]);
	a--;
 return i;
}


int main(void) {
FILE *f;

f=fopen("fact.in","rt");
fscanf(f,"%li",&p);
long pp=p;
long sum,temp;
if (p==0)
n=1;
else
{
n=0;
for (i=1;i<=12;i++)
{ if (h2[i]==p) {n=h[i];break;}
}
if (n==0){
n=0;

a=loofasz(temp);
temp=a;
b=a;
i=12;
while (a>1&&temp!=0) {
neww[a]=p/h2[a-1];
p=p%h2[a-1];
temp=a;
a=loofasz(temp);
}

	sum=0;
for(i=1;i<=b;i++)
sum=sum+neww[i+1]*h2[i];
if (sum==pp)
	 for (i=1;i<=b;i++)
	 if (neww[i+1]==5)	 n=n+neww[i+1]*h[i]-10; else n=n+neww[i+1]*h[i];
if (sum!=pp) { n=-1;}
}
}
fclose(f);
f=fopen("fact.out","wt");
if (n!=-1)
	fprintf(f,"%li ",n);
	else
	fprintf(f,"%d ",-1);
fclose(f);
return 0;
}