http://acm.hdu.edu.cn/showproblem.php?pid=1018
一天了,看不下数,坐不下题。。。唉。。终于a了一道了。。。求n!阶乘的数的位数。才开始我直接按大数阶乘处理。结果肯定超时。最后看了一下解题报告。原来这么简单,还是做得题少,没接触过。。
第一种:log10(n!)=log10(1)+log10(2)+.....+log10(n);
循环求和即可,注意最后要+1,因为log10(1)=0;所以要加上这个误差;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main(){
int n,i,t;
double sum;
scanf("%d",&t);
while(t--){
sum=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=log10((double)i);
}
printf("%d\n",(int)sum);
}
return 0;
}
第二中是 Stirling数,还没接触,只记住了公式:sum=(1/2)*log10(2.0*p*ni)+1.0*n*log10(n/e);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream>
#include<cmath>
#include<cstdio>
#define e 2.7182818284590452354
#define pi acos(-1.0)
using namespace std;
int main(){
int t,n;
double sum;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
sum=1.0/2.0*log10(2.0*pi*n)+1.0*n*log10((1.0*n)/e);
printf("%d\n",(int)sum+1);
}
return 0;
}