2^N 的位数 问题 , 和 N! 的位数问题

第一种做法:

N!=1*2*3....*n

求位数我们一般用对一个数取对数就可以了 ,

log10(n!)=log10(1)+ log10(2) +log10(3)...+log10(n);

所以循环求和就可以了!

但是这里注意一点 结果要加1!因为这里计算出来的 log10(1)=0 !

所以结果要加上这个误差 ‘1’

第二种做法:

这就是我最近研究的斯特林数,第一类斯特林数就可以做这个!

补充一点,斯特林数能够做一切关于阶乘有关的大数运算 要深入学习!

这里给出递归公式:

log10(n!)=1.0/2*log10(2*pi*n)+n*log10(n/e)

 

 

第一类做法:

#include<iostream>
#include<cmath>
#include<cstdio>
#define e 2.7182818284590452354
#define pi acos(-1)
using namespacestd;
intmain(){
intcas,ans,i,n;
double sum;
cin>>cas;
while(cas--){
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
sum+=log10(i);
printf("%d\n",((int)sum));
}
return0;
}

 

 

第二类做法:

#include<iostream>
#include<cmath>
#include<cstdio>
#define e 2.7182818284590452354
#define pi acos(-1)
using namespacestd;
intmain(){
intcas,ans,n;
cin>>cas;
while(cas--){
scanf("%d",&n);
ans=(int)(1.0/2.0*log(2.0*pi*n)/log(10.0)+1.0*n*log(n/e)/log(10.0)+1);
printf("%d\n",ans);
}
return0;
posted on 2012-03-07 10:30  万里心晴  阅读(344)  评论(0编辑  收藏  举报