JavaScript でコラッツ予想の計算をやってみた

コラッツ予想とは、任意の正の整数 n に対し、

  • その数が奇数ならば 3 倍して 1 を足す
  • その数が偶数ならば 2 で割る

という操作を有限回繰り返すと必ず 1 になるであろうという予想です。(ちなみに、1 になったあとに操作を繰り返すと 4 → 2 → 1 → 4 → 2 → 1 → … というループに入ります。)

正の整数を入力して「送信」ボタンをクリックすると、上記の操作を 1 になるまで繰り返します。

ソースコード

<form id="form1" action="#">
    <input type="number" step="1" min="1" max="1000" value="10" id="input-number">
    <input type="button" onclick="calc_collatz()" value="送信">
</form>
<p id="message"></p>
<div id="calculation_result"></div>
@charset "UTF-8";

input#input-number{
    width: 100px;
    margin-right: 10px;
}

table {
    width: auto;
}

table th {
    background: orange;
    border: solid 1px black;
}

table td {
    text-align: right;
    width: min-content;
    border: solid 1px black;
}

table td.left-num {
    background: lightgreen;
}

table td.right-num {
    padding-left: 10px;
}
const calc_collatz = () => {
    const input = document.getElementById("input-number");
    let n = Number(input.value);
    let count = 0;
    let output_html = '<table><tr><th>操作回数</th><th>値</th></tr><tr><td class=\"left-num\"> 0 </td><td class=\"right-num\">' + n + '</td></tr>';

    while (n != 1) {
        if (n % 2 == 0) {
            n /= 2;
        } else {
            n = 3 * n + 1;
        }
        count++;
        output_html += ('<tr><td class=\"left-num\">' + count + '</td><td class=\"right-num\">' + n + '</td><tr>');
    }

    output_html += '</table>';

    document.getElementById("calculation_result").innerHTML = output_html;
    document.getElementById("message").innerHTML = count + ' 回の操作で 1 になりました。';
}

コメント

タイトルとURLをコピーしました