1000!位数为2568位。我们学过数学都知道,1000!即1000的阶层,等同于1000 * 999 * 998 …* 2 * 1,因此我们不可能是自己算出最后的结果来判断1000!有几位数。那么有什么巧妙的方法能判断呢?
答案是肯定的。判断一个数是几位数有一个巧妙的方法:例如:1234是一个四位数,根据科学计数法1234可以写成1.234*103,两边同时取10的对数,则为log101234log10^{1234}log101234=log101.234log10^{1.234}log101.234 * log103log10^{3}log103 。因为log103log10^{3}log103 结果为3,对3+1即等于4,4为1234的位数。因此,我们发现1234的位数就等于1234对10取对数后的整数部分再加1。设1.234为a,a的范围为(0<a<10),因此log10alog10^{a}log10a 的取值范围为0到1之间。
照猫画虎,我们知道1234的位数如何求,则求1000!的位数方法也是相同的。即求出log101000!log10^{1000!}log101000!=log101000∗999....∗2∗1log10^{1000*999....*2*1}log101000∗999....∗2∗1=log101000log10^{1000}log101000+log10999log10^{999}log10999+…+log102log10^{2}log102+log101log10^{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型)来存储log101000!log10^{1000!}log101000!,保证1000个小数相加数值准确,如果直接取int类型log101000log10^{1000}log101000(等于3)到log101log10^{1}log101(等于0)之间有许多近似值误差过大,虽然用两种类型都会造成误差,但用double型来存储则结果误差较小(只加上了log10alog10^{a}log10a的值,而int型则近似值过多)。在最后强制类型转换为int型,即变为整数。整数+1能够得到1000!的位数。当然,我们求log101000!log10^{1000!}log101000!需要借助电脑来计算。