数的长度
来源:互联网 发布:荆门凯度网络公司简介 编辑:程序博客网 时间: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
- 数的长度
- 数的长度
- 数的长度
- NYOJ - 数的长度
- 数的长度
- 数的长度
- 数的长度
- 数的长度
- acm-数的长度
- 数的长度
- NYOJ_69数的长度
- NYOJ69数的长度
- 数的长度
- 数的长度
- NYOJ69数的长度
- 69 数的长度
- NYOJ-数的长度
- nyoj69数的长度
- OC基础—集合类之NSArray、NSMutableArray
- SVN服务器搭建和使用(一)
- 浅谈Java多线程的同步问题
- XX行关于联机交易(OLTP)系统类项目的性能测试技术方案(2)
- 转载,jqueryfileupload与webapi在mvc4中的使用
- 数的长度
- Activity的基本用法
- Address already in use: JVM_Bind<null>:8080
- android Tcp和Udp介绍
- SVN服务器搭建和使用(二) .
- 【读书笔记】iOS应用逆向工程-分析与实践(第二章)
- 基于SLF4J的日志系统需要考虑的细节
- hdu-3487-Play with Chain (Splay tree)
- android.os.NetworkOnMainThreadException异常