博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数阶乘的位数和精确值计算
阅读量:6296 次
发布时间:2019-06-22

本文共 856 字,大约阅读时间需要 2 分钟。

我们知道整数n的位数的计算方法为:log10(n)+1
故n!的位数为log10(n!)+1
 
如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解
 

 

斯特林(Stirling)公式:

于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1
即  1/2*log10(2*PI*n)+n*log10(n/e)+1
 
所以采用下面代码计算阶乘位数,会非常快
 

#define PI 3.141592654#define E 2.71828182846int l(int n){    int s=1;    if(n>3)        s=log10(2*PI*n)/2+n*log10(n/E)+1;    return s;}

 

 

如果要计算阶乘的精确值,则可以采用下面代码。

n:    n 的阶乘返回值:    阶乘结果的位数注意:          本程序直接输出n!的结果,需要返回结果请保留long a[]     需要 math.h
int factorial(int n){long a[10000];int i,j,l,c,m=0,w; a[0]=1; for(i=1;i<=n;i++)    {     c=0;     for(j=0;j<=m;j++)        {         a[j]=a[j]*i+c;         c=a[j]/10000;         a[j]=a[j]%10000;     }     if(c>0) {m++;a[m]=c;} } w=m*4+log10(a[m])+1;printf("\n%ld",a[m]); for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);return w;}

转载于:https://www.cnblogs.com/stonehat/p/3603267.html

你可能感兴趣的文章
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>