输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
Output
共T行,输出对应的阶乘的长度。
Sample Input
3
4
5
6
Sample Output
2
3
3
首先要知道斯特林公式 :
利用此公式就可以求出n!的位数
数学知识:
n! 的位数 = lg(n!)+ 1 ;
换底公式 :lnN!/ln10=log10 N!
结果有可能超int 要用long long int
带参宏的写法:#define Stirling(N) (LL)((0.5*log(2*PI*N)+N*log(N)-N)/log(10))+1
引用一下大佬的博客:https://blog.youkuaiyun.com/liangzhaoyang1/article/details/51145807
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#define PI acos(-1.0)
#define Stirling(N) (LL)((0.5*log(2*PI*N)+N*log(N)-N)/log(10))+1
using namespace std;
typedef long long int LL;
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
printf("%lld\n",Stirling(n));
}
return 0;
}
本文介绍了一种使用斯特林公式来高效计算任意正整数N的阶乘在十进制下的位数的方法。通过引入换底公式和对数运算,文章提供了一个简洁的C++代码实现,该实现可以快速准确地计算出1到10^9范围内任意大整数阶乘的位数。
617

被折叠的 条评论
为什么被折叠?



