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!计算出来,然后去数它的位数,那将是一个不小的工作量啊。也由此看出了代码魅力的所在。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021dragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值