您的位置:首页 > 编程语言

2018年全国多校算法寒假训练营练习比赛(第三场) -A不凡的夫夫【附详尽的代码注释和斯特林公式介绍以及推导过程】

2018-02-07 17:33 441 查看
链接:https://www.nowcoder.net/acm/contest/75/A
来源:牛客网

题目描述
夫夫有一天对一个数有多少位数感兴趣,但是他又不想跟凡夫俗子一样,
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。
输入描述:

第一行是一个整数t(0<t<=1000000)(表示t组数据)
接下来t行,每一行有一个整数n(0<=n<=10000000)
输出描述:

输出n!在8进制下的位数。
示例1
输入
3
4
2
5
输出
2
1
3

思路解析:这题不需要让计算机算n的阶乘是多少(因为当n非常大时,会很慢),我们可以使用斯特林公式,直接一下就出来了。
先看代码吧,看不懂的话后面有介绍斯特林公式和用斯特林公式求位数的推导过程的PPT:
#include<bits/stdc++.h>
//万能头文件,包含了目前c++所包含的所有头文件
using namespace std;
const double PI=acos(-1),e=exp(1);
/*
acos()是反余弦函数,cosπ = -1,所以π = acos(-1)
在函数exp(x)中,x就是次方数,这个函数结果相当于e^x
这两个函数均在,cmath中。(cmath是c++语言中的库函数,
其中的c表示函数是来自c标准库的函数,math为数学常用库函数。)
*/
#define ll long long
//定义ll就是long long
int main()
{
//cout<<fixed<<setprecision(90)<<PI<<endl<<e;//测试PI和e的值
ll t,n,ans;
scanf("%lld",&t);//因为流输入和输出在数值比较大的情况下比较慢,
//所以推荐使用scanf函数进行输入,否则将造成时间超限
while(t--)
{
scanf("%lld",&n);
if(n==0)
{
cout<<1<<'\n';//这里就一种情况,而且数值比较小,因此可以使用流输出。
continue;
}
//cout<<log(8)/log(2);//这就是在C语言中表示以二为底,八的对数,其中二是底数,八是真数。如果这点儿不清楚,可以参考我写的ppt或百度“对数”看下定义。
ans=(int)((log(2.0*PI*n)/2.0+n*log(n/e))/log(8));//先强制转换成int,
printf("%lld\n",ans+1);//别忘最后加1哦!
}
}


PPT下载链接:https://pan.baidu.com/s/1nw16rUx
以下是PPT内容:
第一张:



第二张:



第三张:

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