hdu 1018 Big Number(n!求位数)

http://acm.hdu.edu.cn/showproblem.php?pid=1018

一天了,看不下数,坐不下题。。。唉。。终于a了一道了。。。求n!阶乘的数的位数。才开始我直接按大数阶乘处理。结果肯定超时。最后看了一下解题报告。原来这么简单,还是做得题少,没接触过。。

第一种:log10(n!)=log10(1)+log10(2)+.....+log10(n);

循环求和即可,注意最后要+1,因为log10(1)=0;所以要加上这个误差;

View Code
#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);

View Code
#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;
}



posted @ 2012-01-02 18:45  E_star  阅读(267)  评论(0编辑  收藏  举报