poj1423 Big Number
来源:互联网 发布:不会编程能学数据库吗 编辑:程序博客网 时间:2024/05/01 15:10
题目链接:http://poj.org/problem?id=1423
题目大意:给定一个数,求阶乘的位数
思路:给一个数n,求n的阶乘的位数;直接高精度计算显然很复杂,换个思路,对于一个数m,m的位数就是(int)log10(m)+1。如果m=n*(n-1)*(n-2)*......*1,那么log10(m)=log10(n)+log10(n-1)+.....+log10(2)+log10(1)。即m的位数是( int )( log10(n)+log10(n-1)+.....+log10(2)+log10(1) )+1。由于题目要求的m很大,独立计算会造成重复计算某些值,所以采用预处理。
代码:
//做过的第一道题目是把所有用例输入联系起来的,因为大数的用例要用到小数的用例
//先将所以要求的数都存起来,由于最后要按输入顺序输出结果,所以还要存入id
//按值从小到大顺序排列,先计算最小值的对数,后面的数都建立在他的基础上,
//和上述代码思路相同。最后按id从小到大排列输出结果即可,这样可以避免对内存的溢出
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct node{
int id, num;
double result; //对数的和 所以用double
}a[1010];
int flag;
int cmp(node c, node d)
{
if(flag)
return c.num<d.num; //从小到大排序
return c.id<d.id;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>a[i].num;
a[i].id = i;
a[i].result = 0;
}
flag = 1;
sort(a,a+n,cmp);
for(int i=1;i<=a[0].num;i++)
a[0].result+=log10(i);
for(int i=1;i<=n;i++)
{
a[i].result+=a[i-1].result;
for(int j=a[i-1].num+1;j<=a[i].num;j++)
a[i].result+=log10(j);
}
flag = 0;
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
cout<<(int)a[i].result + 1<<endl; //因为是double 最后转为int
}
return 0;
}
- poj1423 Big Number
- poj1423 hdu1018 Big Number
- POJ1423,Big Number,同hdu1018
- POJ1423 Big Number解题报告
- POJ1423 Big Number(数学)
- poj1423——Big Number//Stirling公式
- POJ1423 HDU1018 Big Number【斯特林公式】【高精度】
- POJ1423————Big Number
- POJ1423 Big Number 【求N的阶乘的位数】
- HDU1018 POJ1423 UVALive2697 UVA1185 ZOJ1526 Big Number【阶乘位数】
- POJ1423
- poj1423
- poj1423
- poj1423
- POJ1423
- big big number 求和
- big number
- Big Number
- 个人经验总结:处理海量数据的经验和技巧
- UltraEdit最新版破解方法及注册机下载
- python打开pdf(python的os模块)
- OCP-1Z0-052-V8.02-110题
- 三角形马赛克简单教程
- poj1423 Big Number
- java名字的由来
- 11gr2 rman异机恢复。
- 疑难总结——1
- 下载并编译Android kernel的指定版本源代码
- Oracle_用存储过程杀掉session解决锁表的问题
- cg编程之 Shader Language原理
- zencart批量添加特价产品,修改特价产品价格
- 如何在eclipse的WEB-INF文件夹下生成class文件夹