思路
錯誤思路
計算出 n! 結果後判斷,是不可以行的,結果太大會溢出。
正確思路
有這樣的現象:從0開始,每加5,其階乘尾部便會增加一個0。比如:5!有一個0,10!有兩個0,15!有三個0...
現象的原因:5和任意偶數相乘就會產生0,而偶數的個數遠比5的個數多,所以每增加5 結尾就會增加一個零。
按照這個現象:n! 尾部0的個數 == n/5。
可是這樣還不完善,因爲沒有考慮到:每次加 5 到了 5 的次方時,會出現增加多個 0 的現象。也就是5*5*...和多個偶數相乘就會產生多個零。
所以:n! 尾部0的個數 == n/5 + n/5*5 + n/5*5*5...
代碼
int CountZero(int N)
{
int ret =0;
while(N)
{
ret+=N/5;
N/=5;
}
return ret;
}
分析:上述第一次循環是N/5,表示含有 5 的個數。
第二次循環是N/5/5,表示含有 5*5 的個數。
第二次循環是N/5/5/5,表示含有 5*5*5 的個數。
...
算法學習並不是完全爲了面試,對程序員的編碼能力提升也是很大的。