求大数阶乘的位数(ACM Big Number问题)
2013-10-30 20:15
232 查看
哎~~~开始A题玩玩,ACM还是蛮有味么~~
问题描述:求一个大数阶乘的位数
解决策略:
方法一:log10(n!)=log10(1*2*3…*n)=log10(1)+log10(2)+…+log10(n)+1
即对log10(n!)的值取整加1就是n!的位数——朴素方法。
方法二:近似计算的方法,斯特林公式。n!近似等于sqrt(2*pi*n) * (n/e)^n
问题描述:求一个大数阶乘的位数
解决策略:
方法一:log10(n!)=log10(1*2*3…*n)=log10(1)+log10(2)+…+log10(n)+1
即对log10(n!)的值取整加1就是n!的位数——朴素方法。
//Author:YunMengZe //DateTime:2013.10.30 //Description:求给定数阶乘的位数 #include <iostream> #include <cmath> using namespace std; int main() { int n; double d=0; cin>>n; for(int i=1;i<=n;i++) { d+=log10(double(i)); } cout<<"n阶乘的位数位: "<<(int)(d+1)<<endl; return 0; }
方法二:近似计算的方法,斯特林公式。n!近似等于sqrt(2*pi*n) * (n/e)^n
//Author:YunMengZe //DateTime:20131030 //Method:斯特林公式 n!=sqrt(2*pi*n)*(n/e)^n #include <iostream> #include <cmath> using namespace std; #define PI 3.1415926 #define e 2.71828 int main() { int n; double d=0; cin>>n; if(n==1||n==0) d=1; else { d=log10(double(2*PI*n))/2 + n*log10(double(n/e)); d=ceil(d); } cout<<"n阶乘的位数为:"<<d<<endl; return 0; }
相关文章推荐
- ACM--大数阶乘位数--HDOJ 1018--Big Number--水
- hdu(1018)Big Number(阶乘位数的计算)
- ACM内部函数--数学问题--大数阶乘
- Big Number(求任意阶乘的位数)
- POJ-1423 计算出n的阶乘的位数大数问题[Stirling公式]
- 杭电problem1018-大数(阶乘的位数问题)
- ACM 另一种阶乘问题
- 利用BigInteger计算Fibonacci数列,及解决大数阶乘
- 打印1到最大的n位数:大数问题,全排列实现
- 大数阶乘末尾0的个数问题 数字的奇妙
- hdoj1212(大数取余)Big Number
- 剑指17_打印从1到最大的n位数(大数问题)
- ACM 大数问题函数及应用
- 求大数阶乘结果的位数
- 棋盘上的麦子(BigInteger处理大数问题)
- java如何用数组解决大数阶乘的问题,例如求n!,n=100000
- 阶乘位数问题
- java竞赛-大数阶乘问题
- 南阳理工ACM《另一种阶乘问题》65
- C问题---1000的阶乘的位数