Cod sursa(job #1893062)

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

using namespace std;

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

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

    return zeros;
}

int cauta_binar(int st,int dr,int value)
{
    int mij, 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;
        while( number_of_fives(answer) == value)
        {
            answer--;
        }
        return ++answer;
    }

}


int main() {

    ifstream inputFile;
    ofstream outputFile;

    inputFile.open("fact.in", ios::in);
    int 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);
    outputFile << cauta_binar(1,100000000,number_of_zeros);

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

 }