Factstone Benchmark

【问题描述】

Amtel已经宣布,到2010年,它将发行128位计算机芯片;到2020年,它将发行256位计算机;等等,Amtel坚持每持续十年将其字大小翻一番的战略。(Amtel于2000年发行了64位计算机,在1990年发行了32位计算机,在1980年发行了16位计算机,在1970年发行了8位计算机,并首先在1960年发行了4位计算机)

Amtel将使用新的标准检查等级——Factstone——来宣传其新芯片大大提高的能力。 Factstone等级被定义为这样的最大整数n,使得n!可以表示为一个计算机字中的无符号整数(比如1960年的4位计算机可表示3!=6,而不能表示4!=24)。

给出一个年份1960 ≤ y ≤ 2160,Amtel最近发布的芯片的Factstone等级是什么? 输入:

给出若干测试用例。每个测试用例一行,给出年份y。在最后一个测试用例后,给出包含0的一行。

输出:

对于每个测试用例,输出一行,给出Factstone等级。

方法1:直接求不大于2k-1的最大整数n!,这种方法极易溢出且速度慢;

方法2:采用对数计算,即根据

                              log2n!=log2n+log2(n-1)+...+log21<=log2(2k-1)<k

注:计算机中的log其实是ln。需要换底公式 logab=lna/lnb;

 

 1 /*
 2  * FactstoneBenchmark.cpp
 3  *
 4  *  Created on: 2016年3月2日
 5  *      Author: hoojjack
 6  */
 7 
 8 
 9 #include <stdio.h>
10 #include <math.h>
11 int main(){
12     int i,j,y;
13     double w,sum;
14     while(1==scanf("%d",&y)&&y){
15 //        w=log(4.0);
16 //        w=2.0;
17         //计算机中的log 是数学中的ln 而不是以10为底数的取对数,所以如果想表示成以2为底4的对数
18         //需要换底公式
19         w=log(4.0)/log(2.0);
20 //        printf("w=%lf\t",w);
21 //        printf("%lf\t",log(4)/log(2));
22         for(i=1960;i<=y;i+=10){
23             w*=2;
24         }
25 //        printf("w=%lf\t",w);
26         j=1;
27         sum=0.0;
28         while(sum<w){
29             sum+=(log((double) ++j)/log(2));
30 
31         }
32         printf("number=%d\n",j-1);
33     }
34     return 0;
35 }

 

转载于:https://www.cnblogs.com/hoojjack/p/5239717.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值