JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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 に対しても高速に動作します。

  1. 【C++】階乗の末尾に並ぶゼロの個数を効率的に求める方法

    整数を入力として与え、その数の階乗における末尾のゼロ(後続ゼロ)の個数を求めるのが本記事の目的です。ここで、ある数 N の階乗とは、1 から N までのすべての整数の積を指します。末尾のゼロが生まれる仕組み数の末尾にゼロが付くのは、その数が 10 の倍数である場合、すなわち因数として (2, 5) のペアを持つ場合だけです。5 より大きい任意の数の階乗を素因数分解すると、2 の個数は必ず 5 の個数よりも多くなるという性質があります。そこで、対象の数を 5 の累乗で順に割っていくことで、因数に含まれる 5 の総数を求められます。この「5 の個数」がそのまま末尾のゼロの個数と一致するのです。入出

  2. C++でnの階乗(n!)の末尾ゼロの個数を求める方法

    問題概要整数nが与えられたとき、n!(nの階乗)の末尾に連続して並ぶゼロ(後続ゼロ)の個数を求めることを考えます。例えば、入力が n = 20 の場合、20! = 2432902008176640000 となるため、末尾にはゼロが4個連続しており、出力は4になります。解法の考え方末尾のゼロの個数は、階乗の計算結果に含まれる「10」の個数で決まります。10 = 2 × 5 であるため、因数2と因数5のペアの数がそのままゼロの個数に対応します。そして階乗の中では、因数2は因数5よりも必ず多く現れるため、因数5の出現回数を数えるだけでよいことが分かります。具体的には、以下の手順で求めます。count