【指数变为对数+理解题目】HDU-1141 Factstone Benchmark

一笑奈何 提交于 2019-12-14 00:10:18

在这里插入图片描述
在这里插入图片描述
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;
}

结果

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!