POJ 2661-Factstone Benchmark(log()的应用)
2015-08-17 16:04
435 查看
题目地址:POJ 2661
题意:从1960年开始,每10年更新一次计算机的最长存储位数,其中,最开始的1960年字长为4位,以后每隔10年就增长一倍的长度。给你一个年份,问这一年时,计算机可以执行n!而不溢出的最大的n值。
思路:第n年的位数k=2^(2+(y-1960)/10),能放在k位中最大的无符号整数是(2^k)-1,如果是直接求不大于(2^k)-1的n!很容易溢出且速度慢,那么我们就引入了对数的运算,即根据log2(n!)=log2(1)+…..+log2(n)<=log2((2^k)-1)
题意:从1960年开始,每10年更新一次计算机的最长存储位数,其中,最开始的1960年字长为4位,以后每隔10年就增长一倍的长度。给你一个年份,问这一年时,计算机可以执行n!而不溢出的最大的n值。
思路:第n年的位数k=2^(2+(y-1960)/10),能放在k位中最大的无符号整数是(2^k)-1,如果是直接求不大于(2^k)-1的n!很容易溢出且速度慢,那么我们就引入了对数的运算,即根据log2(n!)=log2(1)+…..+log2(n)<=log2((2^k)-1)
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const double pi= acos(-1.0); const double esp=1e-7; int main() { int n; double k,sum; while(~scanf("%d",&n)) { if(!n) break; k=log(4*1.0); for(int i=1960;i<=n;i+=10) k*=2; sum=0; int cnt=1; while(sum<k){ ++cnt; sum+=log((double)(cnt)); } printf("%d\n",cnt-1); } return 0; }
相关文章推荐
- 仿真模拟的过程
- 线性规划、梯度下降、正规方程组——斯坦福ML公开课笔记1-2
- LayoutInflater原理分析,View工作原理(一)
- 数据库死锁原因及解决办法(转)
- 好久没来了
- CSS盒模型
- oracle 块的学习——有定义和执行部分的块
- 模板设计模式(TemplatePattern)
- hdu5384(AC自动机)
- [HDOJ4349]Xiao Ming's Hope
- Choose the best route 2680 (dijkstra,反向建图)
- 进程 服务器编程入门
- POJO
- 用Go写了一个小工具,用他脚本下载日志文件,然后让开发自己去下载
- HDU 5087 Revenge of LIS II(次大递增子序列)
- LeetCode(34)Search for a Range
- PCB过孔全介绍
- MySQL Workbench正向逆向工程
- linux网络设备驱动学习
- wxString类型转化