可采用因子分解的方式,每个0,都可以看作是 * 10,而10可以分解为 2 * 5,所以只要将每个数都进行因子分解,收集2和5的个数,其他非2和5的因子与末尾有多少个0无关。
PHP代码如下:
<?php
echo '用时:', ($endAt - $startAt);
?>
经过计算,100的阶乘末尾有24个0,用时小于1ms.
为了校验结果的准确性,可以用大数相乘算法计算出100!的精确值,我这边用了Common Lisp计算了100!的值,与结果吻合。
(defun factorial(n)
(if (> n 1)
(* n (factorial (- n 1)))
1))
(factorial 100)
;;output 9332621544394415268169923885626670049071596826438162
1468592963895217599993229915608941463976156518286253697920827
223758251185210916864000000000000000000000000