您的位置:首页 > 其它

斯特林公式--求高阶乘阶及其位数

2018-02-08 11:26 369 查看
1.知识准备<1>cmath中自带对数函数:double log(double x);//返回logex的值
                     double log10(double x) 返回log10x的值其他对数需要根据公式:

来define转换2.关于斯特林公式:斯特灵公式是一条用来取n阶乘近似值数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确。公式为:

更加准确的极限:

或者

!!!注意:如果要知道N!后得到的数字为几位数,则我们可以知道其位数等于lgN!+1;通常的简化是:

此处的斯特林公式对于n很大时就给出了简化:

于是:n!位数为:[lgn!]+1=


3.例题:链接:https://www.nowcoder.net/acm/contest/75/A
来源:牛客网

夫夫有一天对一个数有多少位数感兴趣,但是他又不想跟凡夫俗子一样,
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。输入描述:
第一行是一个整数t(0<t<=1000000)(表示t组数据)
接下来t行,每一行有一个整数n(0<=n<=10000000)

输出描述:

输出n!在八进制下的位数!——————————————————————————————————————————————————思路:n很大,所以直接求肯定不可能,只能使用斯特林公式,注意这里是八进制,因此要把long10变为log8即可!!代码:
#include <iostream>
#include <math.h>
#include<cstdio>
#define PI acos(-1)//Π=acos(-1)=3.1415926
#define E 2.7182818284//e=2.7182
#define log8(x) log10(x)/log10(8.0)//重点!!define套用数学公式定义log8!
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
if(n==0)//0的时候不能用斯特林,因为log8(0)无意义,因此单独处理!
printf("1\n");
else
{
unsigned long long int ans=(unsigned long long int)((log8(2*PI)+log8(n))/2+n*(log8(n)-log8(E)));//注意强制转换
printf("%llu\n",ans+1);
}

}

return 0;
}
坑点:用peintf和scanf不会超时,而用cin,cout会超时!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: