zoukankan      html  css  js  c++  java
  • (eden)性能评估

    题目描述:Amtel has announced that it will release a 128-bit computer chip by 2010, a 256-bit computer by 2020, and so on, continuing its strategy of doubling the word-size every ten years. (Amtel released a 64-bit computer in 2000, a 32-bit computer in 1990, a 16-bit computer in 1980, an 8-bit computer in 1970, and a 4-bit computer, its first, in 1960.)

    Amtel will use a new benchmark - the Factstone - to advertise the vastly improved capacity of its new chips. The Factstone rating is defined to be the largest integer n such that n! can be represented as an unsigned integer in a computer word.

    输入:Given a year 1960 ≤ y ≤ 2160, what will be the Factstone rating of Amtel's most recently released chip?

    输出:For test, there is one line of input containing y.  For each test case, output a line giving the Factstone rating.

    示例

    输入: 1960

    输出: 3

    (解释:因为1960年计算机是支持4位,其中的最大的无符号数为(全为1):15;3的阶乘为6,4的阶乘为24,故这里的n=3)

    Hint:

    1.取对数避免大数计算,log(n*m) = log(n) + log(m)。

    2.准确理解题意。

    思路

    y = y / 10 - 194;

    求得2^y这个指数,得到该年应该得到多少位的机,然后2^(2^y) - 1即该年的最大无符号整数,但由于直接这样计算得到的数为inf无穷大,即计算机装不下,所以要经过处理,本来是得到2^(2^y) - 1即该年的最大无符号整数这个之后,判断它在哪两个阶乘范围之内n!~(n+1)!,然而这样计算又还要写阶乘函数,又有判断循环,耗时,所以采用

    p! < 2^2^y
    两边取对数
    log(1)+log(2)+...+log(p) < (2^y)*log(2)
    即采用whlie循环一直加直到加到某一个p0超过了后面则出循环,p0 - 1即为所求p

    因为如果直接用(log(2^(2^y) - 1))会超过int float double类型的范围,所以只能够这样将减一忽略不计,因为并不会影响,从而得到只需要计算2^y即可;

    代码

     1 #include<stdio.h>
     2 #include<math.h>
     3 int main() {
     4     int y, i;
     5     scanf("%d", &y);
     6     y = y / 10 - 194;
     7     double k = pow(2, y);
     8     i = 1;
     9     double tot = log(1);
    10     while (tot < k * log(2)) {
    11         i++;
    12         tot = tot + log(i);
    13     }
    14     printf("%d
    ", i - 1);
    15 }

    标答

     1 // from younglee.
     2 #include<stdio.h>
     3 #include<math.h>
     4 int main(void) {
     5     int year, num, n = 2;
     6     double sum = 0;
     7     // for input
     8     scanf("%d", &year);
     9  
    10     // for processing.
    11     num = pow(2, (year - 1960)/10 + 2);//也是求Index
    12     while (sum <= num) {
    13         sum += log(n) / log(2);//把log(2)移到另一边
    14         ++n;
    15     }
    16  
    17     // for output.
    18     printf("%d
    ", n - 2);//因为最后还加了1
    19     return 0;
    20 }

    问题

    ①方法上面可以取对数以代替阶乘判断;

    ②要注意k是浮点数tot也是,不能够直接这样,k还是会很大的,装不下,所以要把减一舍去取对数,从而简化,

    否则会出现这个情况;

    需要学习

    ①思路,简化的方法;

    ②inf,nan。

  • 相关阅读:
    CentOS6 install Ruby 1.9.3
    php注释规范
    ecstore小记
    关于local storage 和 session storage以及cookie 区别简析
    local storage 简单应用‘’记住密码’
    点击按钮播放音频 停止后再次点击再次播放 添加背景音乐
    页面触底自动加载数据
    侧导航下载
    解决ie对于Bootstrap的兼容性问题
    js判断微信 选择浏览器打开
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5050355.html
Copyright © 2011-2022 走看看