Cod sursa(job #546748)

Utilizator aleph0Ionut-Gabriel Radu aleph0 Data 5 martie 2011 14:23:23
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int func(int n)
{
   int k =(int) (log(n) / log(5));
   int i = 1, q = 0, j = 1;;
   for(i = 1; i <= k; i++){
       j *= 5;
       q += n / j;
   }
   return q;

}

int minDiv(int min, int max, int p)
{
    int mid, q;
    mid = (min + max) >> 1;
    q = func(mid);
    if(p != q && mid == min || mid == max)
        return -1;
    else if(p < q)
        return minDiv(min,mid - 1,p);
    else if (p > q)
        return minDiv(mid + 1, max,p);
    else
        return mid;

}

int adjust(int p, int rez)
{
    int i;
    if(rez == -1)
        return -1;
    for(i = rez - 1; i >= 1; i--)
        if(p != func(i))
            return i + 1;
    return i;
}

int main()
{
    FILE *f = fopen("fact.in","r");
    FILE *g = fopen("fact.out","w");
    int p, rez;
    fscanf(f,"%d",&p);
    if(p == 0){
        fprintf(g,"%d ",1);
        fclose(f);
        fclose(g);
        return 0;
    }
    else if(p <= 100000){
        rez = minDiv(0,1000000,p);
        rez = adjust(p,rez);
        fprintf(g,"%d ",rez);
        fclose(f);
        fclose(g);
        return 0;
    }
    else {
        rez = minDiv(400000,500000000,p);
        rez = adjust(p,rez);
        fprintf(g,"%d ",rez);
        fclose(f);
        fclose(g);
        return 0;
    }

}