Pagini recente » Cod sursa (job #1830012) | Cod sursa (job #2624997) | Cod sursa (job #2058024) | Cod sursa (job #2719102) | Cod sursa (job #2839195)
#include<iostream>
#include<fstream>
#include<cmath>
#define UPPER_BOUND 10000000
int calc_digits_of_factorial(int n) {
if(n < 0)
return 0;
if(n <= 1)
return 1;
double digits = 0;
// this is like calculaton log10(n!)
// !!! keep in mind that log10(a) + log10(b) = log10(ab)
for(int i = 2; i <= n ; ++i)
digits += log10(i);
return floor(digits) + 1;
}
int _binary_search_n(int p, int left, int right) {
if(!p) {
return 1;
} else {
while(left <= right) {
int mid = left + (right - left ) / 2;
int digits = calc_digits_of_factorial(mid);
std::cout << "Eu sunt digits: " << digits << "\n";
if( digits >= p) {
if(digits == p) {
return mid;
}
else {
right = mid - 1;
}
}
else {
left = mid + 1;
}
}
}
return -1;
}
int main() {
int p;
std::ifstream in("fact.in");
std::ofstream out("fact.out");
in >> p;
int result = _binary_search_n(p, 1, UPPER_BOUND);
std::cout << result << "\n";
out << result << "\n";
in.close();
out.close();
return 0;
}