数的长度

来源:互联网 发布:荆门凯度网络公司简介 编辑:程序博客网 时间:2024/05/17 04:43

我们知道整数n的位数的计算方法为:log10(n)+1
故n!的位数为log10(n!)+1
 
如果要求出n!的具体值,对很大的n,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解

 

斯特林(Stirling)公式:

于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1
即  1/2*log10(2*PI*n)+n*log10(n/e)+1
import java.math.BigInteger;import java.util.Scanner;public class ShuDeChangDu {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();while(n-->0){int N=input.nextInt();//方法一超时:/*BigInteger sum=BigInteger.ONE;for(int i=1;i<=N;i++){sum=sum.multiply(BigInteger.valueOf(i));}System.out.println(sum.toString().length());*///方法二:count=log10(N!)=log(1)+log(2)+...log10(N)double count=1;for(double i=1;i<=N;i++){count= (count+Math.log10(i));}System.out.println((int)count);}}}


 
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define PI 3.141592654#define E 2.71828182846int length(int n){int s=1;if(n>3)s=log10(2*PI*n)/2+n*log10(n/E)+1; //斯特林公式,估算阶乘位数return s;}int main(){int m,n;scanf("%d",&m);while(m){scanf("%d",&n);n=length(n);printf("%d\n",n);m--;}return 0;}



0 0
原创粉丝点击