/*1119. Factstone Benchmark
题目大意:
1960年发行了4位计算机,从此以后每过10年,计算机的位数变成两倍。输入某一个年份,求
出在这个年份的最大的整数n使得n!能被一个字表示。
解题思路:
先求出年份对应的字长。
用科学记数法表示阶乘,以2为底,从指数可以得到位数,与字长比较即可。
*/
#include <iostream>
#include <math.h>
using namespace std;
/*pow函数
函数名称: pow
函数原型: double pow( double x, double y );
函数功能: 计算x的y次幂
所属文件: <math.h>
这个例子中计算了8的2次方:
double x=8, y=2; double z; z=pow(x,y);
*/
/*log函数
double log (double); 以e为底的对数
double log10 (double);
c++中自然对数函数:log(N)
以10为底:log10(N)
但没有以2为底的函数但是可以用换底公式解 决:log2(N)=log10(N)/log10(2)
有些编译器支持:
cout << log(10) <<endl;
cout << log10(10) <<endl;
cout << log2(8) << endl;
*/
int main(){
int year;
int chip;
int temp1;
int temp2;
double sum=0 ; //错误1:sum必须为double型
int n= 1;
while (1){
cin >> year;
if(year == 0)
break;
temp1 = year / 10;
temp2 = temp1 - 194;
chip = (int)pow(2,temp2);
sum=0 ;
n= 1;
//重点1:
//因为字长length=2^p,那么最大的数为 2^length
//若要 2^length >= n! = n * n-1 * n-2 * ... * 2 * 1
//对两边取log2, 即 log2(2^length) >= log2(n!) = log2(n) + log2(n-1) + ...+log2(1)
//也就是等于 length >= log(n)/log2 + log(n-1)/log2 + ...+ log(1)/log2
while(sum <= chip)
{
sum += log2(n);// 重点2:有些编译器不支持log2(n),则log(n) / log(2);
++n;
}
cout << n-2 << endl;
}
return 0;
}
Factstone Benchmark
最新推荐文章于 2019-08-04 23:12:22 发布