Cod sursa(job #1893084)

Utilizator ioana_meirosuMeirosu Ioana-Cristina ioana_meirosu Data 25 februarie 2017 14:35:55
Problema Factorial Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <fstream>

using namespace std;

long number_of_fives(long number)
{
    long i=5, zeros=0;

    while(number / i >= 1)
    {
        zeros+= number/i;
        i*=5;
    }

    return zeros;
}

long cauta_binar(long st,long dr,long value)
{
    long mij=0, answer;
    if(st > dr)
    {
        return -1;
    }

    mij = (st + dr) / 2;

    if( number_of_fives(mij) > value)
    {
        return cauta_binar(st,mij-1,value);
    }

    else if(number_of_fives(mij) < value)
    {
        return cauta_binar(mij + 1, dr, value);
    }

    else if(number_of_fives(mij) == value)
    {
        answer = mij;
        int i=0;
        while( number_of_fives(mij) == value)
        {
            mij--;
            i++;
        }

        return answer +  1 - i;
    }

}


int main() {

    ifstream inputFile;
    ofstream outputFile;

    inputFile.open("fact.in", ios::in);
    long number_of_zeros;

    /**
     * Pentru a determina cate zerouri are factorialul unui numar este suficient sa determinam numarul de
     * cifre de 5 care exista in factorialul sau, deoarece o combinatie de forma 2*5 ne ofera automat o
     * cifra de 0. De exemplu 25 => ne ofera doua cifre de 5, deci numarul 25! va avea: 25/5=5 + 25/25= 5+1
     * =6 cifre de 0.
     */

    if(!inputFile.is_open())
    {
        cout<<"eroare la deschiderea fisierului de input!\n";
        return -1;
    }

    inputFile >> number_of_zeros;

    /**
     * Conform restrictiilor problemei, numarul cautat se afla intre 0 si 100 000 000. Deoarece nu putem sti
     * de la ce numar sa plecam pentru a cauta solutia, vom efectua o cautare binara in intervalul mentionat
     * mai sus. Stim ca am ajuns la solutia in momentul in care numarul de zerouri al factorialului nr-ului
     * curent verificat de noi este egal cu cel cerut de problema.
     */

    outputFile.open("fact.out", ios::out);

    if(number_of_zeros==0)
        outputFile << 0;
    else
        outputFile << cauta_binar(1,10000000000,number_of_zeros);

    inputFile.close();
    outputFile.close();

 }