题目链接:http://soj.sysu.edu.cn/1119
题目大意:假设1960年的计算机是4-bit,以后每隔10年就翻一翻,比如1970年是8-bit,1980年是16-bit。现在给出一个年份 y,1960<= y <= 2160,要求找出一个最大的整数 n 使得 n! 不超过这一年的计算机能表示的无符号整数
解题思路:两边取对数后比较。
刚开始以为挺简单的,直接比较 n! 和 2^k 即可,然而,在计算时发现会出现 2^(2^22),这数值太大,无法表示,然后就想到了用高精度乘法,但是又觉得太麻烦,于是就想上网看看有没有更简便的方法,于是就搜到了一种方法:取对数降低将大数化为小数。的确,这是一个很好的方法,于是就用了这方法。
参考思路来源:http://blog.sina.com.cn/s/blog_7c848e4f0100r2vv.html
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n, y, bit, i;
double loguint, sum;
while (1)
{
cin >> y;
if (y == 0)
break;
n = (y - 1960) / 10; // 第几个10年
bit = pow(2, 2 + n); // 这一年中的计算机有多少位
loguint = bit * log(2); // 这一年计算机能表示的无符号整数的log值
sum = 0;
for (i = 1; i < 10000000000; i++)
{
sum += log(i); // i 的阶乘的 log 值
if (sum > loguint)
break;
}
cout << i - 1 << endl; // 由于 i 时已经超过,故应减一
}
return 0;
}