Factstone Benchmark

/*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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值