【指数变为对数+理解题目】HDU-1141 Factstone Benchmark
程序员文章站
2022-04-06 13:50:09
...
1、理解题目:从1960开始,每十年,翻一倍,1960年是4位,1970年是8位,1980年是16位,1990年是32位,2000年是64位。给定一个年份,就已知其对应的位数,要求的是最大数n,使得n!小于该位数。
2、翻译过来就是1 * 2 * … * n < 2 的 (year-1960)/10+2 次方。由于指数爆炸,数字太大,因此把指数转换为对数,得出(log表示以2为底,而C++中的log()是以10为底,因此要再使用换底公式,log1=log(1.0)/log(2.0):log1+log2+…+logn < (year-1960)/10+2,求出n即可。
代码
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int N;
cin>>N;
while(N) {
int bit = (N - 1960) / 10 + 2;
bit = 1 << bit;
double ans = 0.0;
int i = 1;
while(ans<bit) {
ans += log(double(++i)) / log(2.0);
}
cout<<(i-1)<<endl;
cin>>N;
}
return 0;
}