【JavaScript】ある数が有限小数になるかどうかを判定する方法
はじめに:実数の分類
10進法において、すべての実数は大きく次の2つのグループに分けられます。
- 有理数
- 無理数
この記事では、このうち有理数に焦点を当てて解説していきます。
有理数とは何か
p/q(ただし q ≠ 0)という分数の形式で表すことができる数を「有理数」と呼びます。たとえば、14、4.6、3.33333... などがその代表例です。
そして有理数は、分子 p を分母 q で割った結果に基づいて、さらに次の2種類に分類できます。
- 有限小数:割り切れて小数部分が終わる数(例:0.25)
- 循環小数:同じ数字の並びが無限に繰り返される数(例:0.333...)
判定のための基本ルール
分数が有限小数になるか循環小数になるかを見分けるための、シンプルで強力な目安があります。
- 分母 q の素因数が 2 と 5 のみである場合、その分数は必ず有限小数になります。
- 分母 q の素因数に 2 と 5 以外の数が含まれる場合、その分数は循環小数になります。
これは、10進法の基数が 10 = 2 × 5 であることに由来しています。分母の素因数が 2 と 5 だけで構成されていれば、分母・分子に適切な数を掛けて分母を 10 のべき乗にできるため、必ず割り切れるのです。
JavaScriptでの実装
それでは、数値 q を引数として受け取り、その値が有限小数を生成できる場合は true、そうでない場合は false を返すJavaScript関数を実装してみましょう。
アルゴリズムの考え方は非常にシンプルです。q を 2 または 5 で繰り返し割り続け、最終的に 1 になれば有限小数です。一方、途中で 2 でも 5 でも割り切れなくなった場合は、それ以外の素因数が存在することを意味するため、循環小数であると判断できます。
const num = 1250;
const isTerminating = num => {
while(num !== 1){
if(num % 2 === 0){
num /= 2;
}else if(num % 5 === 0){
num /= 5;
}else{
return false;
}
}
return true;
};
console.log(isTerminating(num));
実行結果
上記のコードを実行すると、コンソールには次の出力が表示されます。
true
1250 = 2 × 5 × 5 × 5 × 5 と素因数分解でき、2 と 5 のみで構成されているため、正しく true が返されています。
まとめ
分母の素因数に注目することで、ある分数が有限小数になるか循環小数になるかを簡単に判定できます。今回紹介したような素因数を順に除去していくアプローチは、計算量も少なく実用的なので、ぜひ活用してみてください。
-
JavaScriptで桁の和が回文数かどうかを判定する関数を作る方法
問題概要今回は、数値 num を第1引数(唯一の引数)として受け取る JavaScript 関数を作成します。この関数は、num の各桁の数字を合計した値が回文数(palindrome number)である場合に true を返し、そうでない場合は false を返す必要があります。例えば、関数への入力が次のようだったとします。const num = 781296;このとき、期待される出力は以下の通りです。const output = true;出力の解説781296 の各桁の和を計算すると、7 + 8 + 1 + 2 + 9 + 6 = 33 となります。33 は左右から読んでも同じ値になる
-
JavaScriptで数値に序数接尾辞(st・nd・rd・th)を追加する方法
問題JavaScriptで関数を作成する必要があります。この関数は、数値 num を最初の(唯一の)引数として受け取ります。関数の役割は、英語の序数表記のルールに従って、数値に「st」「nd」「rd」「th」という接尾辞を追加することです。具体的なルールは以下の通りです。一の位が1で終わる数値には「st」を使用します(例:1st、発音はfirst)一の位が2で終わる数値には「nd」を使用します(例:92nd、発音はninety-second)一の位が3で終わる数値には「rd」を使用します(例:33rd、発音はthirty-third)上記ルールの例外として、下二桁が11・12・13となる数値に