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!需要借助电脑来计算。

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zjruiiiiii

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

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

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

打赏作者

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

抵扣说明:

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

余额充值