斯特林公式的初识

第一次写博客,很是生疏,Em....作为一名刚入门Code领域的小菜鸡,难得平时做题,今天无意刷到一道求n!的的位数的题,刚开始思路不是很清晰,也无从下手,因为数据也稍微有点大,Em.....之后就上网搜了一些相关问题偶然发现了斯特林公式,不是加特林哦哈哈哈,在网上也看了别的博主的一些讲解,我觉得挺不错的,不过有的相对于我们基础薄弱的来说有的就有丢丢不友好了,以下内容就我个人对这个题型的一点见解,OK 废话不多说,切入正题。

首先明白此处应用的斯特林公式是对n!取对数之后再加一求得其位数,并非数学上单纯的求n!的近似值。

数学公式:n!=((2*π*n)^1/2)*(n/e)^n  //觉得丑的话可以自行百度........

Eg:求十进制下的n!的位数

对上述公式取对数(以10为底)得lgn!=1/2(lg(2*π)+lg(n))+n(lgn-lge),

所以n!的位数为lgn!+1 即lgn!+1=1/2(lg(2*π)+lg(n))+n(lgn-lge)+1为所求的位数;

为什么取以十为底的对数呢,不取别的,因为是求10进制下的,如果要求K进制下的怎么办?

那就利用换底公式(数学不好直接写结果了。。)个人喜欢换成以e为底

即(0.5*(ln(2*π)+ln(n))+n(ln(n)-1))/ln(k)+1即为所求的K进制下的n!的位数。

以下的代码是AC八进制下

#include<bits/stdc++.h>
#define ll long long
#define pi acos(-1)
#define e  exp(1)
using namespace std;
inline ll husband(ll n)
{
    if(!n)
    return 1;
    ll num=((log(2*pi)+log(n))*0.5+n*(log(n)-1))/log(8)+1;
    return num;
}
int main()
{
    int n;
    ll m;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%lld",&m);
        printf("%lld\n",husband(m));
    }

    return 0;
}

上面代码AC的例题

以上的内容仅供参考,如有大牛发现不对的地方还望指正~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值