斯特林(Stirling)公式 求大数阶乘的位数
2018-02-04 18:10
393 查看
我们知道整数n的位数的计算方法为:log10(n)+1 n!=10^m 故n!的位数为 m = log10(n!)+1
lgN!=lg1+lg2+lg3+lg4+lg5+....................+lgN;
但是当N很大的时候,我们可以通过数学公式进行优化:(即Stirling公式)
N!=sqrt(2*pi*N)*(N/e)^N;(pi=3.1415926=acos(-1.0),e=exp(1))
lgN!=(lg(2*pi)+lgN)/2+N*(lgN-lge);
斯特林公式可以用来估算某数的大小结合lg可以估算某数的位数,或者可以估算某数的阶乘是另一个数的倍数。
例题
https://www.nowcoder.net/acm/contest/75/A
题意 求解n的阶乘八进制下的位数
n!=8^res n!=e^m
res=log8(n!) m=loge(n!)
log8(n!)= loge(n!)/loge(8) res = m/loge(8)换底公式
m=loge(2*pi*n)/2+n*loge(n/e)
AC代码
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 1e6+10; const int inf = 0x3f3f3f3f; const double e = exp(1); const double pi = acos(-1.0); const double epx = 1e-10; typedef long long ll; int main() { ll t; scanf("%lld",&t); while(t--){ ll n; scanf("%lld",&n); if(n==0||n==1){ puts("1"); continue; } double res = (log(2*pi*n)/2.0+n*log(n/e))/log(8)+1; printf("%lld\n",(ll)res); } return 0; }
相关文章推荐
- hdu 1018 求大数阶乘位数有公式
- 斯特林大数公式求阶乘位数
- 斯特林[striling]公式(求阶乘(n!)的位数)
- 菜鸟的大数阶乘的位数公式计算
- 利用斯特林(Stirling)公式求解n!的位数
- N的阶乘的长度 V2(斯特林近似) 求 某个大数的阶乘的位数 .
- hdu1018大数阶乘的位数,斯特林数的各种应用
- POJ 1423 Big Number 大数阶乘的位数计算
- hdu 1018 Big Number (求一个数的阶乘的位数,公式!!!)
- [ACM Steps]2.2.8 Big Number 求N!位数 大数N阶乘的位数
- 求大数的阶乘的位数:PKU :1423:Big Number
- hdoj1018 大数阶乘位数
- 关于大数的阶乘与确定阶乘结果的位数
- 大数阶乘的位数和精确值计算【转】
- 大数运算(6)——大数阶乘(求位数)
- 大数阶乘的位数和精确值计算
- hdu 1018 Big Number(公式求阶乘位数)
- POJ-1423 计算出n的阶乘的位数大数问题[Stirling公式]
- 大数阶乘的位数和精确值计算
- 大数阶乘的位数和精确值计算