题意:给你一个数,计算他的阶乘有多少位。
算阶乘再看位数必超时。1<=n<=1e7。
想每次%10 。一开始用int 果然有精度问题。于是double水了。600+ms
后来想到可以 log 10 () 。于是900+ms。
总觉得不对。应该有公式。看discuss 后终于知道了。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-8
#define PI 3.141592654
#define LL long long
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)
using namespace std;
//int main()
//{
// int m;
// scanf("%d",&m);
// while(m--)
// {
// int n;
// scanf("%d",&n);
// int s=1;
// double c=1;
// for(int i=2;i<=n;i++)
// {
// c*=i;
// while(c>=10)
// {
// c/=10;
// s++;
// }
// }
// printf("%d\n",s);
// }
//}
//687MS
//int main()
//{
// int m;
// double s;
// scanf("%d",&m);
// while(m--)
// {
// int n;
// scanf("%d",&n);
// s=1.0;
// for(int i=1;i<=n;i++)
// s+=log10(i);
// printf("%d\n",(int)s);
// }
// return 0;
//}
//968MS
#define E 2.71828182845904523536028747135266250
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n;
scanf("%d",&n);
double s=log10(sqrt(2*PI*n))+n*log10(n/E);
printf("%d\n",(int)s+1);
}
}
//0ms