Cod sursa(job #206360)

Utilizator Poisoned_IvyAnda Nicolae Poisoned_Ivy Data 6 septembrie 2008 09:07:29
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <math.h>

unsigned long p;
FILE *f, *g;

//calculeaza cate zerouri are la final x!
unsigned long zerouri(int x)
{
    unsigned long i=5, s=0;
    while (floor(x/i)>0)
    {
          s+=floor(x/i);
          i*=5;
    }
    return s;
}

void binsearch(int a, int b)
{
         unsigned long zero;
         int i, m;
         if (a>b) 
         {
            fprintf(g, "-1");
            return;
         }
         m=(a+b)/2;
         zero=zerouri(m);
         if (zero<p) binsearch(m+1, b);
         if (zero>p) binsearch(a, m-1);
         if (zero==p) 
         {
            for (i=a; i<=m; i++)
                if (zerouri(i)==p) 
                   {
                                   fprintf(g, "%d", i);
                                   return;
                   }
         }
}


void det(unsigned long p)
{
     unsigned long i=1, zero;
     //printf("intru\n");
     //printf("p=%lu\n", p);
     zero=zerouri(i);
     //printf("zero=%lu\n", zero);
     while (zero<p)
     {
         //printf("zero=%lu\n", zero);
         i*=5;
         zero=zerouri(i);
     }
     //printf("i/5=%d i=%d\n", i/5, i);
     if (i>=5)
        binsearch(i/5, i);
     else 
        fprintf(g, "1");
//     printf("rez=%lu\n", zero);
//     return zero;
}


int main()
{
    f=fopen("fact.in", "r");
    fscanf(f, "%lu", &p);
    g=fopen("fact.out", "w"); 
    det(p);   
    getchar();
    return 0;
}