Pagini recente » Cod sursa (job #1271388) | Cod sursa (job #1185389) | Cod sursa (job #1546025) | Cod sursa (job #1501299) | Cod sursa (job #1893058)
#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)
{
cauta_binar(st,mij-1,value);
}
else if(number_of_fives(mij) < value)
{
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();
}