1000!有几位数,为什么?

1000!=1000 * 999 * 998 * … * 2 * 1,可以见得1000!是一个很大的数。
那么如何计算1000!的位数呢?
我们知道任何一个数都可以用科学计数法表示,比如
1234=1.234 * 103
我们如果对该等式两边同时取10的对数,那么等式就变为
log10(1234)=log10(1.234 * 103)
也就等价于
log10(1234)=log10(1.234) +log10103
最后变为
log10(1234)=log10(1.234)+3
我们发现1234的位数就等于1234对10取对数后的整数部分再加1。
那么就可以这么说:
如果数字N用科学计数法表示为:N = a * 10n(0<a<10)
那么log10N=log10(a )+ n (其中0<log10a<1)
这样N的位数也就等于n+1。
这样一来1000!的位数也就有思路了,它就等于log10(1000!)的整数部分加1。
而log10(1000!)=log10(1000 * 999 * 998 * … * 2 * 1)
也就是log10(1000!)=log10(1000)+log10(999)+…+log10(1)
这样我们就可以通过循环来求的它的值了。

#include<stdio.h>
#include<math.h>
int main()
{
    
    
	int n = 1000;
	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;
}

值得注意的是,我们应该用double类型的变量来存储log10(1000!),保证 1000 个小数相加数值精确,不然会使得数据丢失,导致结果不准确。
最后将sum强制类型转化为整型后再加1,输出的结果便是1000!的位数了,总共2568位,要是我们老老实实的将1000!计算出来,然后去数它的位数,那将是一个不小的工作量啊。也由此看出了代码魅力的所在。

猜你喜欢

转载自blog.csdn.net/chenlong_cxy/article/details/113181952