阶乘的结果与Gamma函数是一致的:
Gamma函数
C++11内置了计算Gamma函数的std::tgamma和对数版本的std::lgamma:
#include 也可以利用斯特林公式计算近似值: 斯特林公式 这个公式在n很小的时候就很逼近准确结果了,且n越大结果越准确。 阶乘、Gamma函数与斯特林公式的比较 #include intmain(){intn=100;doublek=1+1.0/(12*n)+1.0/(288*std::pow(n,2));// 越完整越精确 std::cout< 在计算过程中可以通过减小d增加i防止溢出,并保持表示的值不变(实际有精度损失): if(result.d>1e100)// 1e100表示10的100次方,可设定其他值 {result.d/=1e100;result.i+=100;} 实现也很简单: intmain(){MyNumberresult;intn=100;for(inti=1;i<=n;++i){if(result.d>1e100){result.d/=1e100;result.i+=100;}result.d*=i;}while(result.d>=10){result.d/=10;result.i+=1;}printf_s(\"%d! = %.10f * 10^%d\ 运行结果是: 100! = 9. * 10^157 如果要精确求解,就得把数设计成由各个数位组成的格式,比如12345用一个数组表示为: 将数的低位存储在数组低位,再根据这个格式实现乘法的进位操作: #include intmain(){intresult[MAXSIZE];result[0]=1;// 默认值为1 intpos=0;// 结果的最高位索引,默认从0开始 intn=100;for(inti=1;i<=n;++i)// 依次计算i的阶乘 {intcarry=0;// 进位值 for(intj=0;j<=pos;++j)// 依次计算结果的各个数位 {inttmp=result[j]*i+carry;result[j]=tmp%10;// tmp的个位数保留在当前位 carry=tmp/10;// 其他用于进位 }while(carry>0)// 如果还有多余的进位值依次置于高位 {result[++pos]=carry%10;// 增加pos数目后放置高位值 carry/=10;}}std::cout< #include result.emplace_back(1);// 默认值为1 intn=100;for(inti=1;i<=n;++i)// 依次计算i的阶乘 {intcarry=0;// 进位值 for(std::size_tj=0;j }while(carry>0)// 如果还有多余的进位值依次置于高位 {result.emplace_back(carry%10);// 放置高位值 carry/=10;}}std::cout< 100! = 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务