大数的阶乘
2015-11-07 22:59
176 查看
首先要确定这个数的阶乘需要开多大的数组,可以用Stirling公式。
输入不超过10000的正整数,计算n!的具体值。
我们发现f[i]里面只有1个数字,但是f[i]是int型的,能存9位数,这样不仅速度加快,开销也减小很多。
输入不超过10000的正整数,计算n!的具体值。
#include<iostream> #include<math.h> using namespace std; const int maxn=50000; int main(){ int n,s,k,c; int f[maxn+1]; while (cin>>n) { memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=n;i++){ c=0; for(int j=0;j<=maxn;j++){ s=f[j]*i+c; c=s/10; f[j]=s%10; } } for(k=maxn;k>=0;k--) if(f[k]!=0) break; for(int j=k;j>=0;j--) cout<<f[j]; cout<<endl; } return 0; }
我们发现f[i]里面只有1个数字,但是f[i]是int型的,能存9位数,这样不仅速度加快,开销也减小很多。
#include<iostream> #include<iomanip> using namespace std; const int maxn=20000; int main(){ int n,s,k,c; int f[maxn+1]; while (cin>>n) { memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=n;i++){ c=0; for(int j=0;j<=maxn;j++){ s=f[j]*i+c; f[j]=s%100000; c=s/100000; } } for(k=maxn;k>=0;k--) if(f[k]!=0) break; cout<<f[k]; for(int j=k-1;j>=0;j--){ cout<<setw(5)<<setfill('0')<<f[j]; } cout<<endl; } return 0; }
相关文章推荐
- shell正则表达式(zhuan)
- 连接池中的maxIdle,MaxActive,maxWait参数
- jQuery的DOM操作(四)
- [iOS开发项目-11] 英雄列表
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
- github 上传和下载代码
- 算法游戏
- 编码
- iOS__推送通知
- iOS中BOOL和bool的区别
- iOS中类和对象还有,nil/Nil/NULL的区别
- shuoj 1659 跳马问题
- 动手实验:继承条件下的构造方法调用
- linux下用户账户切换
- oc和swift类型的单例
- PHP5.3以上版本使用pthreads PHP扩展真正支持多线程
- 本地通知
- Android图片本地载入,显示绝对路线,并载入
- Unit test学习总结之.Net
- 黑马程序员-Java 反射-