Cod sursa(job #1492773)

Utilizator Etienne27Stefan Etienne27 Data 28 septembrie 2015 09:57:33
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <limits.h>
using namespace std;
FILE*fin=fopen("fact.in","r");
FILE*fout=fopen("fact.out","w");
int n;
int div5(int x)
{
    int i=5,s=0;
    while (i<=x)
    {
        s=s+x/i;
        i*=5;
    }
    return s;
}
int cautbin(int inf,int sup)
{
    //cout<<inf<<" "<<sup<<endl;
    if (inf<=sup)
    {
        int nr5 = (sup - inf) / 5;
        if (nr5>1)
        {
            int mij;
            if (nr5 % 2 == 0)
            {
                mij=inf + 5 * (nr5 / 2);
            }
            else
            {
                mij=inf + 5 * (nr5 / 2 + 1);
            }
            int z=div5(mij);
            //cout<<inf<<" "<<mij<<" "<<sup<<" "<<z<<endl;
            if (z==n)
                return mij;
            else
            {
                if (z<n)
                    return cautbin(mij,sup);
                else
                 //   return 0;
                   return cautbin(inf,mij);
            }
        }
        return -1;
    }
    else
        return -1;
}
int cautbin1(int inf,int sup)
{
    //cout<<inf<<" "<<sup<<endl;

    int nr5 = (sup - inf) / 5;

    while (nr5>1)
    {
        int mij;
        if (nr5 % 2 == 0)
        {
            mij=inf + 5 * (nr5 / 2);
        }
        else
        {
            mij=inf + 5 * (nr5 / 2 + 1);
        }
        int z=div5(mij);
        //cout<<inf<<" "<<mij<<" "<<sup<<" "<<z<<endl;
        if (z==n)
            return mij;
        else
        {
            if (z<n)
                inf = mij;
            else
                sup = mij;
            nr5 = (sup - inf) / 5;
        }
    }
    return -1;
}


int main()
{
    fscanf(fin,"%d",&n);
    if (n==0)
        fprintf(fout,"%d",1);
    else
        fprintf(fout,"%d",cautbin1(0,INT_MAX));
    return 0;
}