Cod sursa(job #546218)

Utilizator aleph0Ionut-Gabriel Radu aleph0 Data 4 martie 2011 17:15:54
Problema Factorial Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#include<stdlib.h>

int nrDiv(int a, int b)
{
    int r = 0, k = 0;
    while(r == 0){
        r = a % b;
        if(r == 0){
            k++;
            a /= b;
        }
        else
            break;
    }
    return k;
}

int func(int n)
{
    int k = 0, i;
    if(n < 5)
        return 0;
    for(i = 5; i <= n; i++)
        k += nrDiv(i,5);
    return k;
}

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);
    printf(" %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,5000000,p);
        rez = adjust(p,rez);
        fprintf(g,"%d ",rez);
        fclose(f);
        fclose(g);
        return 0;
    }

}