N ! = 1 *2 * 3 * 4 * … * n
问题1:求N的阶乘
一定要用递推的方式来求N的阶乘,以防采用递归方法耗费过多的时间
int GetFactorial(int n)
{
int ans = n;
while (--n) // note, here cannot be 'n--'
ans *= n;
return ans;
}
问题2: 求阶乘尾数0的个数,如 N = 12,则 12的阶乘尾数有两个0
何时会产生0?
2 * 5 , 4 * 5, x * 10 …
22 * 23 * 24 * 25 -> 产生2个0 … 因为25为以上算式提供了两个5
由此可以总结出:只要出现5,即会在结尾处产生0
因为整个数列中偶数的个数一定多于5的个数,5*偶数->产生0,由此可以得到代码如下
int CountZero(int n)
{
int zeroCount = 0;
for (int i = 5; i <= n;++i)
{
int value = i;
while (value % 5 == 0)
{
zeroCount++;
value /= 5;
}
}
return zeroCount;
}