HDOJ 1018 Big Number
来源:互联网 发布:mac使用的音乐播放器 编辑:程序博客网 时间:2024/06/05 10:24
这里要用到一个公式——斯特林公式:,要求位数的话将等式两边取对数,log10(n!) = log10(2*PI*n)/2+n*log10(n/E),所以阶乘结果的位数为log10(n!) = log10(2*PI*n)/2+n*log10(n/E)+1(注意当n=1时,等式右边为0,要加1才行)。
#include <iostream>#include <math.h>using namespace std;int main(){ int n,m; cin>>n; while (n--) { cin>>m; double pi; pi=acos(-1.0); double l; l= (m*log(double (m)) - m + 0.5*(log(double (2*pi*m))))/log(10.0); int len; len=(int) l+1; cout<<len<<endl; } return 0;}
刚开始以为这道题就是简单地求出一个整数的阶乘,将其存在数组中,除去前导0就可以直接得出阶乘的位数,但是运行程序之后就发现,思路错了,因为题目条件n<10^7,但是求阶乘的时间复杂度过大,程序运行肯定超时,但是算是一种求大数阶乘的方法,在此贴出来留作以后参考。
#include <iostream>#include <string.h>using namespace std;#define MAXN 10000000int f[MAXN];int main(){ int n,m; cin >>n; while (n--) { cin>>m; memset(f,0,sizeof(f)); f[0]=1; int i,j; for (i=2;i<=m;i++) {<span style="white-space:pre"></span>//求大数阶乘 int s,c=0; for (j=0;j<MAXN;j++) { s=f[j]*i+c; f[j]=s%10; c=s/10; } } for (j=MAXN-1;j>=0;j--) if (f[j]) break; cout<<j+1<<endl; } return 0;}
0 0
- HDOJ 1018 Big Number
- HDOJ 1018 Big Number
- hdoj 1018 Big Number
- HDOJ 1018 Big Number
- HDOJ 1018 Big Number
- hdoj 1018 Big Number
- HDOJ 1018 Big Number
- HDoj-1018-Big Number
- HDOJ Big Number 1018
- hdoj 1018 big number
- hdoj 1018 Big Number
- HDOJ 1018 Big Number
- hdoj-1018-Big Number
- HDOJ 1018 Big Number
- HDOJ 1018 Big Number
- HDOJ 1018 Big Number
- HDOJ 1018 Big Number
- hdoj 1018 Big Number
- Iterator - 迭代器模式
- STL_map——map::empty
- 智能开关开发进展
- Ubuntu下搭建tftp服务器最简单方法
- 东软实训(二十一)
- HDOJ 1018 Big Number
- 关于韩语博客专栏的说明
- 解析ELF 运行结果
- bzoj1750 [Usaco2005 qua]Apple Catching
- tag branch trunk
- linux中关于创建子进程系统堆栈的分析
- 程序员在实战中的蜕变
- jQuery获取节点和子节点文本
- STL_map——map::end