数的长度

原创 2015年07月10日 19:44:28

描述

    N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?

输入
首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
输出
对于每个数N,输出N!的(十进制)位数。

样例输入
3
1
3
32000
样例输出
1
1
130271


#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,t;
	double d;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		d=0;
		for(i=1;i<=n;i++)
		  d+=log10(i);
		printf("%d\n",(int) d+1);
	}
	return 0;
}        




方法一: 
* 可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对 该式两边取对数,有 M =log10^n! 即:M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,该M是n!的精确位数。当n比较大的时候,这种方法方法需要花费很多的时间。 
方法二: 
* 利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 ); 当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况! 有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,有兴趣的话可看这里。这种方法速度很快就可以得到结果。详细证明如下:http://episte.math.ntu.edu.tw/articles/mm/mm_17_2_05/index.html 


相关文章推荐

spl中数表字段的一般长度

  • 2009年08月11日 14:04
  • 38KB
  • 下载

线性时间查找数量超过数组长度一半的数

期望线性时间查找数量超过数组长度一半的数思路分析事实上,数量超过数组长度(n)一半的数也就是数组中第n/2大的数。 这道题如果不限制时间复杂度,brute force(通过排序)查找的时间复杂度可达...

算法实战:给定一个带通配符问号的数W,问号可以代表任意一个一位数字。 再给定一个整数X,和W具有同样的长度。 问有多少个整数符合W的形式并且比X大?

算法实战: 给定一个带通配符问号的数W,问号可以代表任意一个一位数字。 再给定一个整数X,和W具有同样的长度。 问有多少个整数符合W的形式并且比X大?...

长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i

原文链接:http://blog.csdn.net/u014659656/article/details/45115573 Question:长度为n的数组乱序存放着0至n-1. 现在只能进行0与...

数的长度

数的长度 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你...
  • CTTACM
  • CTTACM
  • 2015年03月09日 20:32
  • 204

任意长度的两个大数的乘法

方法(一):关于大数乘法,可以使用数组来模拟小学三年级的乘法竖式计算过程,代码如下:#include "iostream"#include "string"using namespace std;in...

两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。

#include using namespace std; /*函数作用:取待排序序列中low、mid、high三个位置上数据,选取他们中间的那个数据作为枢轴*/ int median(int a...

【Codeforces Round 271 (Div 2)D】【DP】Flowers 黑色必须连续摆放k,长度为n的摆放方案数

D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes inpu...

打开文件读取信息,统计单词长度大于指定值的个数

#include #include #include #include #include #include #include using namespace std; typedef v...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数的长度
举报原因:
原因补充:

(最多只允许输入30个字)