zoukankan      html  css  js  c++  java
  • hdu1141(二进制数位,二分,打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1141

    题意:××公司是制造computer的,1960年它造的computer是4bit的,之后每10年翻倍;

    有一个衡量computer的标准,就是它最大可以存下n!(无符号位),那么它就是n级;

    求x年时该公司的电脑为几级(1960<= x <=2160);

    思路:2160年时computer是4×pow(2, 20)=4194304bit,那么能储存的最大数大概为pow(2, 4194304)数量级,直接暴力求n显然是不可能的;

    我们可以打表求n!二进制表示有多少位,再二分即可;

    用a(n)表示n!二进制多少位;

    有:a(n!) = (int)log2(n!) + 1 ; 

    由对数运算可得:a(n!) = int(log2(1)+log2(2)...+log2(n)) + 1;

    http://www.cnblogs.com/geloutingyu/p/5978149.html (10进制数位求法及证明(hdu1018),与二进制类似,这里的二进制就不再证明啦)

    代码:

     1 #include <iostream>
     2 #include <math.h>
     3 #include <algorithm>
     4 #include <stdio.h>
     5 #define MAXN 400000
     6 using namespace std;
     7 
     8 int a[MAXN];
     9 
    10 void meter(void){   //**打表,数组a中储存下标i对应阶乘的二进制位数
    11     double cnt = 0;
    12     for(int i=1; i<MAXN; i++){
    13         cnt += log2(i);
    14         a[i] = (int)cnt+1;
    15     }
    16 }
    17 
    18 int main(void){
    19     meter();
    20     int n;
    21     while(scanf("%d", &n)&&n!=0){
    22         int cnt = (n-1960)/10;
    23         int ans = 4*pow(2, cnt);
    24         int pos = lower_bound(a, a+MAXN, ans)-a;
    25         if(a[pos]>ans){
    26             pos--;
    27         }
    28         printf("%d
    ", pos);
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    bzoj4734
    51nod1056
    51nod1048
    51nod1248
    51nod1044
    51nod1132
    51nod1146
    51nod1226
    Spring Boot: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
    sqlserver命令创建数据库和表 demo
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5986096.html
Copyright © 2011-2022 走看看