题目链接:https://cn.vjudge.net/problem/HDU-1018
题意:
给你一个整数n,求n的阶乘是多少位数字。1 ≤ n ≤ 10^7
先输入一个整数t ,有t组数据,每组数据输入一个整数n,输出一个整数答案。
样例
输入
2
10
20
输出
7
19
题解
n非常大,整数类型无法存储。用到了一个公式 :斯特灵公式
附上大佬的博客,讲的很好:https://blog.csdn.net/lishuhuakai/article/details/8017296
-
n! = ((2*pi*n)^(1/2))*((n/e)^n);
-
可以推出lg(n!)=(lg(2*pi)+lg(n))/2 + n*(lg(n)-lg(e));
代码
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const long double c1=0.798179868358; //lg(2*pi)
const long double c2=0.434294481903; //lg(e)
int main(){
int n,t;
scanf("%d",&t);
int ans;
long double c3;
while(t--){
scanf("%d",&n);
c3=log10((double)n);
if(n>3){
ans=int((c3+c1)/2+n*(c3-c2)+1);
}else{
ans=1;
}
printf("%d\n",ans);
}
return 0;
}
不用斯特灵公式也可以做,一个整数x的位数等于log10(x)+1.
n的阶乘的位数就等于 1+log10(n!)=1+log10(1)+log10(2)+log10(3)+log10(4)+...log10(n).
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int n;
scanf("%d",&n);
double ans=1;
for(int i=1;i<=n;i++){
ans+=log10(i);
}
printf("%d\n",int(ans));
}
return 0;
}