1000!有几位数,为什么?

Posted zjruiiiiii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1000!有几位数,为什么?相关的知识,希望对你有一定的参考价值。

1000!位数为2568位。我们学过数学都知道,1000!即1000的阶层,等同于1000 * 999 * 998 …* 2 * 1,因此我们不可能是自己算出最后的结果来判断1000!有几位数。那么有什么巧妙的方法能判断呢?

答案是肯定的。判断一个数是几位数有一个巧妙的方法:例如:1234是一个四位数,根据科学计数法1234可以写成1.234*103,两边同时取10的对数,则为 l o g 1 0 1234 log10^{1234} log101234= l o g 1 0 1.234 log10^{1.234} log101.234 * l o g 1 0 3 log10^{3} log103 。因为 l o g 1 0 3 log10^{3} log103 结果为3,对3+1即等于4,4为1234的位数。因此,我们发现1234的位数就等于1234对10取对数后的整数部分再加1。设1.234为a,a的范围为(0<a<10),因此 l o g 1 0 a log10^{a} log10a 的取值范围为0到1之间。

照猫画虎,我们知道1234的位数如何求,则求1000!的位数方法也是相同的。即求出 l o g 1 0 1000 ! log10^{1000!} log101000!= l o g 1 0 1000 ∗ 999.... ∗ 2 ∗ 1 log10^{1000*999....*2*1} log101000999....21= l o g 1 0 1000 log10^{1000} log101000+ l o g 1 0 999 log10^{999} log10999+…+ l o g 1 0 2 log10^{2} log102+ l o g 1 0 1 log10^{1} log101 。我们最后只是要其中的整数部分,在其最后加1即可。

#include<stdio.h>
#include<math.h>
int main()
{
	double sum = 0.0;
	int i = 0;
	for (i = 1; i <= 1000; i++)
	{
		sum = sum + log10(i);
	}
	int ret = (int)sum + 1;
	printf("%d\\n", ret);
	return 0;
}

注意:准确来说我们应该只取整数最后加1。这里要将1000!的阶层看作一个数。此时每一项我们应该用double(或float型)来存储 l o g 1 0 1000 ! log10^{1000!} log101000!,保证1000个小数相加数值准确,如果直接取int类型 l o g 1 0 1000 log10^{1000} log101000(等于3)到 l o g 1 0 1 log10^{1} log101(等于0)之间有许多近似值误差过大,虽然用两种类型都会造成误差,但用double型来存储则结果误差较小(只加上了 l o g 1 0 a log10^{a} log10a的值,而int型则近似值过多)。在最后强制类型转换为int型,即变为整数。整数+1能够得到1000!的位数。当然,我们求 l o g 1 0 1000 ! log10^{1000!} log101000!需要借助电脑来计算。

以上是关于1000!有几位数,为什么?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 c 中 int 位数最多 100 位或 1000 位的位数?

JS中如何获取一个number类型的长度,例如有几位数

作业6

作业六

第六次作业

第六次作业