这一题是要求给定数的阶乘的结果的位数,如3!=6,就是1位
但是输入的n最大可以到10000000,所以很容易超时或者内存不够用
第一次做想用BigInteger(Java程序员的懒惰劣根),连用log求对数来计算阶乘的位数都不会......
毫无悬念地Time Limit了,代码如下:
后来看了一下Discuss,才发现这题有数学公式可以拿来用,叫Stirling公式
就是在n很大的时候,n! = √2 π n (n/e)^n (1+Θ( 1/n)),
取n! ≈sqrt(2*pi*n)*(n/e)^n,其中e是自然对数,
对n! 取10的对数log10,得log10(n!) = log10(sqrt(2*π*n)) + n * log10(n/e),就是n!的位数
于是又写了下面的代码:
然后AC了,时间137ms~~~
又一次感受到了数学工具的重要性,再一次膜拜数学大牛,不想做代码民工,就要学好数学知识啊!