求大数阶乘的位数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何求阶乘的位数
一般有三种方法:
1.log10(1)+log10(2)+···+long10(n)取整后加1
这个是我做的AC过的。
2.#include
3.#include
4.int main(){
5.int N,j = 1;
6.int number,temp = 0;
7. long double member = 0;
8.scanf("%d",&N);
9. while(N> 0){
10. N--;
11.scanf("%d",&number);
12. member = 0 ;
13. for(int i = 1,temp = 0;i<= number ;i++){
14. member += log10(i * 1.0);
15. }
16. temp = floor(member) + 1;
17.printf("%d\n",temp);
18. }
19. return 0;
20.}
2.Stirling公式
斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用,而且,即使在n很小的时候,斯特灵公式的取值已经十分准确。
公式为:
这就是说,对于足够大的整数n,这两个数互为近似值。更加精确地:
或
用Stirling公式计算n!结果的位数时,可以两边取对数,得:
log10(n!) = log10(2*PI*n)/2+n*log10(n/E);
故n!的位数为log10(2*PI*n)/2+n*log10(n/E)+1(注意:当n=1时,算得的结果为0)
n的位数为[lg10(n)]+1
n!的位数为
[lg10(n*(n-1)*(n-2)*…..*1)]+1=[lg10(n)+lg10(n-1)+lg10(n-2)+….+lg10(1)]+1 #include
using namespace std;
#include
const double PI=acos(double(-1));
const double e=exp(double(1));
int main()
{
intN,num;
cin>>num ;
while(num--)
{
cin>> N ;
intlen = 0 ;
len = int((N*log(N) - N + 0.5 * log(2*N*PI) ) / log(10)) + 1;
// len = int(log10(sqrt(2*PI*N))+N*log10(N/e))+1;
printf("%d\n",len);
}
return 0;
}
3.Knuth的算法,这个见到的比较少。