题解的方法确实让我大开眼界。
求n!的位数。
方法1:
求10^m>=n!,的最小m值。
=log10(n!)=log10(n)+log10(n-1)+log10(n-2)+…+log10(1)。
为了保存精度,答案用double存,最后数据类型转换并+1。double转int向下取整。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        double ans=0;
        for(int i=1;i<=n;i++)
            ans+=log10(i);
        printf("%d\n",(int)ans+1);
    }
    return 0;
}

方法二:
斯特林公式:

n!的位数=1/2log10(2pin)+n(log10(n)-log10(e));

#include <bits/stdc++.h>
using namespace std;
const double pi=3.1415926;//注意精度,否则wa
const double e=2.71828182;
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        double ans=0.5*log10(2*pi*n)+n*(log10(n)-log10(e));
        printf("%d\n",(int)ans+1);
    }
    return 0;
}