思路1:N!除以10^(k-1)(k为N!的位数)等于一个介于1 和10 之间的小数
那么就转换成求K。那么在阶乘的过程中超过了10就将结果除以10,k就等于除10的次数加1。
#include <stdio.h>
int main()
{
int T,n,ans,i;
double x;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
x=1.0;
ans=0;
for(i=1;i<=n;i++)
{
x*=i;
while(x>10)
{
x/=10;
ans++;
}
}
printf("%d\n",ans+1);
}
}
思路2:利用log10(m*n)=log10(m)+log10(n);
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--){
int a,i;
double h=0;
scanf("%d",&a);
for(i=1;i<=a;i++)h+=log10(i);
printf("%d\n",int(h)+1);
}
}