输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
输入
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
输出
共T行,输出对应的阶乘的长度。
输入样例
3
4
5
6
输出样例
2
3
3
对于n来说,要是求阶乘的话数据范围需要达到10^9以上才可以使用斯特林公式,否则会精度损失,造成误差比较大。
但是要是求的是n的阶乘的长度的话,可以利用公式((log10(2*PI*n))/2+n*(log10(n/e))+1),但是直接让计算机去求对数即lgN!+1这个好像是不对的,我用了
(ll)((log10(sqrt(2*PI*n*1.00))*pow(n/e,n))+1))运行都是错的,所以求长度还是用第一个,自己求好对数再让计算机去运行吧
1 #include<stdio.h> 2 #include<string.h> 3 #include<cmath> 4 using namespace std; 5 const double PI=3.1415926535898; 6 const double e=2.718281828459; 7 typedef long long ll; 8 9 int main() 10 { 11 int tt,n; 12 scanf("%d",&tt); 13 while(tt--) 14 { 15 scanf("%d",&n); 16 printf("%lld\n",(ll)((log10(2*PI*n))/2+n*(log10(n/e))+1));//注意是long long,int的话会WA 17 } 18 return 0; 19 }