コラッツ予想とは、任意の正の整数 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 になりました。';
}
コメント