您的位置:首页 > 其它

UVa 10916 Factstone Benchmark

2010-03-04 16:52 363 查看
/*
coder:ACboy
date: 2010-3-4
result: AC
description: UVa 10916 Factstone Benchmark
*/

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int years;
#ifndef ONLINE_JUDGE
freopen("10916.txt", "r", stdin);
#endif
while (cin >> years)
{
if (years == 0) break;
else {
int k = (years - 1960) / 10;
int bit = 4;
while (k--)
{
bit *= 2;
}
// 刚开始的时候用位运算计算能存储的最大值,但是bit的最大值可能是2的20次方
// 1 << bit的最大值根本就放不进去。
// double max = 1 << bit;
double max = bit * log(2.0);
double N = 0;
double i;
for (i = 1; ; i++) {
N += log(i);
if (N > max) break;
}
cout << i - 1 << endl;
}
}
return 0;
}


因为bit的值的最大值为220 所以不能把能表示的最大值(2的220次方)存储在语言

的任何内置类型中,考虑一下用大整数,但是有点麻烦。有没有其他的方法呢???

先看看本题如何求解,题目的要求是i!能够放在bit位二进制的表示的整数中求i的最

大值。本题的技巧在于要使用log函数即以e为底的对数,由对数的性质我们可以知道

ln(N!) = ln(1) + ln(2) + ... + ln(N); 而我们可以对能表示的数取对数即ln(2bit) =

bit * ln(2)。所以问题的求解就是找到第一个i使得ln(i!) 大于bit  * ln(2),则结果为

i - 1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 语言 2010