zoukankan      html  css  js  c++  java
  • Uva 10916 Factstone Benchmark

    题目可以这样理解:

    给出一个数k,求(max{n| n!< 2^k, kleq 2^{22}})。

    RE多次,WA多次,WA题时特别是算法有问题时,不要想当然地按照自己理解的想法去做题,用马哲的话说,就是要遵循客观规律,按照事物的本来面目去理解事物……

    做法:由于给出的k比较大,不可能计算(2^k),所以考虑计算(log_2(n!)),n从1开始累加,直到满足条件为止。

    这里就想到了:既然是求以2为底的对数,而计算机中整数是用二进制表示的,那直接取最高位的1所在位置不就行了吗?这种想法是错误的,原因在后面。

    另外这道题可以打表,没打表也能过,没卡时限。

    # include <stdio.h>
    # include <math.h>
    
    int solve(int n)
    {
    	double sum = 0;
    	for (int i = 1; ; ++i) {
    		sum += log(i)/log(2);
    		if ((int)sum >= (0x1<<n)) return i-1;
    	}
    }
    int main(){
    	int y, n;
    	while (1) {
    		scanf("%d", &y);
    		if (y==0) break;
    		n = (y-1960)/10+2;		
    		printf("%d
    ", solve(n));
    	}
    	
    	return 0;
    }
    

    错误提示:小数点的累加

  • 相关阅读:
    SSH免密登陆
    Linux服务器绑定多网卡IP
    搭建简易网站
    Linux中raid磁盘阵列
    Linux中防火墙命令
    Linux中LVM逻辑卷管理
    Linux中fdisk分区
    Linux计划任务
    Linux基础命令(三)
    Linux基础命令(二)
  • 原文地址:https://www.cnblogs.com/txd0u/p/3463186.html
Copyright © 2011-2022 走看看