Cod sursa(job #116449)

Utilizator razvanelu99Razvan Andrus razvanelu99 Data 18 decembrie 2007 17:27:10
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
#include<time.h>
int intreg(char a)
{
      if (a=='0') return 0;
      if (a=='1') return 1;
      if (a=='2') return 2;
      if (a=='3') return 3;
      if (a=='4') return 4;
      if (a=='5') return 5;
      if (a=='6') return 6;
      if (a=='7') return 7;
      if (a=='8') return 8;
      if (a=='9') return 9;

return 0;
}
int a[100];
int main()
{
//clrscr();
FILE *fin,*fout;
fin= fopen ("fact.in","r");
fout= fopen ("fact.out","w");
long int p,n=0,m;
char a[20];
m=0;
int c=1,i;
fscanf(fin,"%s",&a);
if (a[0]=='0') fprintf(fout,"%d",1);
else
{
p=0;
while (a[m]!='\0')
     {
     p=p*10+intreg(a[m]);
     m++;
     }
while (p/78125)
     {
     n+=78125;
     p=p-19524;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
while (p/15625)
     {
     n+=15625;
     p=p-3900;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
while (p/3125)
     {
     n+=3125;
     p=p-776;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
while (p/625)
     {
     n+=625;
     p=p-152;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
while (p/125)
     {
     n+=125;
     p=p-28;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
while (p/5)
     {
     n+=25;
     p=p-4;
     m=n;
     while (m%5==0)
	  {
	  if (m%5==0) p--;
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     if (!c) break;
     }
if (c)
  while (p)
     {
     n++;
     m=n;
     while (m%5==0)
	  {

	  if (m%5==0)
	    {
	    p--;
	    }
	  m/=5;
	  if (p==0&&m%5==0) c=0;
	  if (!c) break;
	  }
     }
int c1,v[10];
if (!c) fprintf (fout,"%d",-1);
else
   {
   c1=0;
   while (n)
	{
	v[++c1]=n%10;
	n/=10;
	}
   for (i=c1;i>=1;i--) fprintf (fout,"%d",v[i]);
   }
}
fclose(fin);
fclose(fout);
return 0;
}