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

JavaScriptで1/nの循環小数(循環節)の長さを求める方法

問題

数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成します。

この関数には、次の2つの役割があります。

  • まず、その数が10と互いに素(共通の約数が1のみ)であるかどうかを判定します。互いに素でない場合は -1 を返します。
  • 10と互いに素である場合は、1をその数で割ったときに小数部が循環する桁数(循環節の長さ)を返します。

たとえば、関数への入力が次の場合を考えてみましょう。

入力

const num = 123;

出力

const output = 5;

出力の解説

123は2でも5でも割り切れないため、確実に10と互いに素です。そして1を123で割ると、次のようになります。

1 / 123 = 0.008130081300813…

この結果から、小数部の「00813」が無限に繰り返されていることがわかります。循環している部分の長さは5桁なので、出力は5となります。

サンプルコード

以下が実際のコードです。

const num = 123;
const findRepeatingPart = (num = 1) => {
    if(num % 2 === 0 || num % 5 === 0){
        return -1;
    } else {
        let res = 10 % num, count = 1;
        while(res != 1){

            res = res * 10 % num;
            count++;
        };
        return count;
    }
};
console.log(findRepeatingPart(num));

出力

5

アルゴリズムの仕組み

このアプローチのポイントは剰余演算にあります。10と互いに素な数とは、すなわち2でも5でも割り切れない数のことです。そのため、最初の判定では num % 2 === 0 || num % 5 === 0 で互いに素かどうかを簡単に確認できます。

1/n の割り算を筆算で行うことを思い浮かべると、各ステップで「余りに10を掛けて再度 n で割った余り」を追いかけていることがわかります。小数の循環は、この余りが以前の状態に戻った瞬間に始まります。したがって、余りが再び 1 になるまでループを回し、その反復回数を数えれば、それがそのまま循環節の長さになります。

この方法は筆算のように文字列を扱う必要がなく、純粋な数値計算だけで済むため、非常にシンプルかつ効率的です。

  1. JavaScriptで数値が三角数かどうかを判定する方法

    三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正

  2. JavaScriptで特定の長さを持つ部分配列の最大平均値を求める方法

    問題概要整数の配列 arr を第1引数に、数値 num を第2引数として受け取るJavaScript関数を作成する必要があります。この関数の目的は、長さがちょうど num である連続する部分配列(サブアレイ)の中から、平均値が最大となるものを見つけ出し、その最大平均値を出力することです。入力例const arr = [1, 12, -5, -6, 50, 3]; const num = 4;出力例const output = 12.75;出力の解説このケースでは、求めるべき部分配列は [12, -5, -6, 50] です。これら4つの要素の合計は 51 となり、51 ÷ 4 = 12.75