感觉自己脑子还是太僵了,上一题是大卡特兰数,用到了高精度,这题看到又是大数阶乘,所以想都没想就套了高精度模板,然后自己写了一个输出数字位数的函数,这里还要注意大数模板里的len是指高精度里的数组的程度,但是数组的每个单元最多是可以存放四个数字的,所以最后的那个单元要特殊考虑。
但是后来Runtime Error(ACCESS_VIOLATION)了很多次以后才发现n的范围是给到了10的7次方,那么用高精度需要开的数组也是会爆掉的
后来查了一下才发现,数字的位数可以通过log'10来判断,比如21,log10(21)=1.几,那么数字的位数就是2
这里阶乘还可以很好的利用起来log化乘为加的性质,即log(n!)=log(1*2*3*4*5*...*10)=log(1)+log(2)+log(3)+...+log(n)
用一个循环,再取整加一就可以了
关于位数想到log10,关于位数想到log10,关于位数想到log10 重要的事情说三遍!!!
AC代码如下:
#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
int n;
scanf("%d",&n);
double sum=0.0;
for(int i=2;i<=n;i++)
sum+=log10(i);
printf("%d\n",(int)sum+1);
}
return 0;
}