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;