JavaScriptで階乗の末尾にあるゼロの個数を求める方法
整数 n が与えられたとき、n!(階乗)の末尾に連続して現れるゼロの個数を返す関数を作成します。
例えば、以下のようになります。
trailingZeroes(4) = 0
trailingZeroes(5) = 1 // 5! = 120 のため
trailingZeroes(6) = 1
考え方
階乗の末尾のゼロは、「2 × 5 = 10」というペアがいくつ作られるかによって決まります。階乗の中では2の個数が5の個数より常に多いため、約数として含まれる5の個数を数えれば、末尾のゼロの個数と一致します。
具体的には、n / 5 で5の倍数の個数を、n / 25 で25(= 5²)の倍数の個数を、というように5の冪乗ごとに加算していきます。
サンプルコード
const num = 17;
const findTrailingZeroes = num => {
let cur = 5, total = 0;
while (cur <= num) {
total += Math.floor(num / cur);
cur *= 5;
};
return total;
};
console.log(findTrailingZeroes(num)); // 17!
console.log(findTrailingZeroes(5)); // 5!
console.log(findTrailingZeroes(1)); // 1!
実行結果
コンソールには以下のように出力されます。
3
1
0
解説
- findTrailingZeroes(17) → 3:17 ÷ 5 = 3(余り切り捨て)、17 ÷ 25 = 0 なので合計は 3 です。実際、17! = 355687428096000 となり、末尾にゼロが3つ並びます。
- findTrailingZeroes(5) → 1:5! = 120 のため、末尾のゼロは1個です。
- findTrailingZeroes(1) → 0:1! = 1 なので、末尾のゼロは存在しません。
このアルゴリズムはループ回数が log₅(n) 程度しかないため、非常に大きな n に対しても高速に動作します。
-
【C++】階乗の末尾に並ぶゼロの個数を効率的に求める方法
整数を入力として与え、その数の階乗における末尾のゼロ(後続ゼロ)の個数を求めるのが本記事の目的です。ここで、ある数 N の階乗とは、1 から N までのすべての整数の積を指します。末尾のゼロが生まれる仕組み数の末尾にゼロが付くのは、その数が 10 の倍数である場合、すなわち因数として (2, 5) のペアを持つ場合だけです。5 より大きい任意の数の階乗を素因数分解すると、2 の個数は必ず 5 の個数よりも多くなるという性質があります。そこで、対象の数を 5 の累乗で順に割っていくことで、因数に含まれる 5 の総数を求められます。この「5 の個数」がそのまま末尾のゼロの個数と一致するのです。入出
-
C++でnの階乗(n!)の末尾ゼロの個数を求める方法
問題概要整数nが与えられたとき、n!(nの階乗)の末尾に連続して並ぶゼロ(後続ゼロ)の個数を求めることを考えます。例えば、入力が n = 20 の場合、20! = 2432902008176640000 となるため、末尾にはゼロが4個連続しており、出力は4になります。解法の考え方末尾のゼロの個数は、階乗の計算結果に含まれる「10」の個数で決まります。10 = 2 × 5 であるため、因数2と因数5のペアの数がそのままゼロの個数に対応します。そして階乗の中では、因数2は因数5よりも必ず多く現れるため、因数5の出現回数を数えるだけでよいことが分かります。具体的には、以下の手順で求めます。count