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
sum = sum + log10(i);
}
int ret = (int)sum + 1;
printf("%d\n", ret);
return 0;
}
值得注意的是,我们应该用double类型的变量来存储log10(1000!),保证 1000 个小数相加数值精确,不然会使得数据丢失,导致结果不准确。 最后将sum强制类型转化为整型后再加1,输出的结果便是1000!的位数了,总共2568位,要是我们老老实实的将1000!计算出来,然后去数它的位数,那将是一个不小的工作量啊。也由此看出了代码魅力的所在。
|