zoukankan      html  css  js  c++  java
  • Factstone Benchmark(数学)

    http://poj.org/problem?id=2661

    题意:Amtel在1960年发行了4位计算机,并实行每十年位数翻一番的策略,将最大整数n作为改变的等级,其中n!表示计算机的无符号整数(n!<=无符号整数)。给出一个年份1960<=y<=2160,求此时计算机的等级n是多少?

    思路:首先求出计算机在第y年的位数k,则此时计算机的无符号整数为2^k-1,则 n!<=2^k-1, 直接求n的阶乘容易溢出,此时可以两边同时取对数得:

    log2(n!)<=log2(2^k-1) → log2(n)+log2(n-1)‥‥‥log2(1) <= log2(2^k-1) < log2(2^k)=k.

    通过换底公式得 log(n)+log(n-1))‥‥‥log(1) < k*log(2); ps:( 换底公式 loga(b)=logc(b)/logc(a),<math>头文件中log(n)表示以e为底的n的对数)。

    通过累加 log(i)(i >= 1),直到和超过 k*log(2)  break;则 i-1即为等级。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 int main()
     5 {
     6     int year;
     7     while(~scanf("%d",&year)&&year)
     8     {
     9         int i;
    10         double k = 2;
    11         for (i = 1960; i <= year; i+=10)
    12             k*=2;
    13         k*=log(2);
    14         double sum = 0;
    15         for (i = 2;; i++)
    16         {
    17             sum += log(double(i));
    18             if (sum >= k)
    19                 break;
    20         }
    21         printf("%d
    ",i-1);
    22     }
    23     return 0;
    24 }
    View Code
  • 相关阅读:
    log4j
    hashContext
    sql语句
    css样式
    作业七:(二)疑问解答
    作业七:(1)翻译
    结对编程作业
    软件优缺点评价(补交)
    C#程序分析
    VS2013安装及测试练习
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3608572.html
Copyright © 2011-2022 走看看