n的階乘n!中的末尾有多少個0?
問題:n的階乘n!中的末尾有多少個0? 例如:n = 5,n! = 120.末尾有1個0.
分析:想到這個問題,有人可能第一反應就是先求出n!,然後再根據求出的結果,最後得出n!的末尾有多少個0。但是轉念一想,會不會溢位,等等。
其實,從"哪些數相乘可以得到10"這個角度,問題就變得比較的簡單了。
(1)首先考慮,如果n的階乘為k和10的m次方的乘積,那麼n!末尾就有m的0。
(2)如果將n的階乘分解後,那麼n的階乘可以分解為:2的x次方,3的y次方,4的0次方(2的x次方已計算),5的z次方.....的乘積。
由於10 = 2 * 5,所以m只能和x和z有關,每一對2和5相乘就可以得到乙個10。
於是m = min(x, z),不難看出x大於z,因為被2整除的頻率比被5整除的頻率高的多。所以可以把公式簡化為m = z。
由上面的分析可以看出,只要計算出z的值,就可以得到n!末尾0的個數
方法一:要計算z,最直接的方法就是求出n的階乘的所有因式(1,2,3,...,n)分解中5的指數,然後求和。
int zero(int n)
}return num;
}
方法二:
z = n / 5 + n / (5 * 5) + n / (5 * 5 * 5).....直到n / (5的k次方)等於0
公式中n / 5表示不大於n的數中能被5整除的數貢獻乙個5,n / (5 * 5)表示不大於n的數中能被25整除的數貢獻乙個5.......
int zero(int n)
return num;
}
練習題:hdu1124 factorial
N的階乘 N 中的末尾有多少個0
問題 n的階乘 n 中的末尾有多少個0?例如 n 5,n 120.末尾有1個0.分析 想到這個問題,有人可能第一反應就是現求出n 然後再根據求出的結果,最後得出n 的末尾有多少個0。但是轉念一想,會不會溢位,等等。其實,從 那些數相乘可以得到10 這個角度,問題就變得比較的簡單了。首先考慮,如果n的...
N的階乘 N 中的末尾有多少個0
問題 n的階乘 n 中的末尾有多少個0?例如 n 5,n 120.末尾有1個0.分析 想到這個問題,有人可能第一反應就是現求出n 然後再根據求出的結果,最後得出n 的末尾有多少個0。但是轉念一想,會不會溢位,等等。其實,從 那些數相乘可以得到10 這個角度,問題就變得比較的簡單了。首先考慮,如果n的...
N的階乘 N 中的末尾有多少個0
問題 n的階乘 n 中的末尾有多少個0?例如 n 5,n 120.末尾有1個0.分析 想到這個問題,有人可能第一反應就是現求出n 然後再根據求出的結果,最後得出n 的末尾有多少個0。但是轉念一想,會不會溢位,等等。其實,從 那些數相乘可以得到10 這個角度,問題就變得比較的簡單了。首先考慮,如果n的...