整数をローマ数字に変換するJavaScriptアルゴリズムの解説
今回は、引数として渡された整数値に対応するローマ数字を返す関数 intToRoman() を作成してみましょう。名前の示すとおり、この関数は数値をローマ数字の文字列へと変換します。
ローマ数字の基本ルール
ローマ数字は次の7つの記号で構成されます。
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
さらに、4や9のような数値は減算表記と呼ばれる特別な形式で表現されます。具体的には IV(4)、IX(9)、XL(40)、XC(90)、CD(400)、CM(900)です。これらを正しく処理することが変換アルゴリズムのポイントになります。
アルゴリズムの考え方
ここでは「貪欲法」と呼ばれるアプローチを採用します。大きな価値を持つ記号から順に判定し、現在の数値がその価値以上であれば対応する記号を結果に追加して数値を減らす、という操作を数値が0になるまで繰り返します。
コード例
const intToRoman = (num) => {
let result = "";
while(num){
if(num>=1000){
result += "M";
num -= 1000;
}else if(num>=500){
if(num>=900){
result += "CM";
num -= 900;
}else{
result += "D";
num -= 500;
}
}else if(num>=100){
if(num>=400){
result += "CD";
num -= 400;
}else{
result += "C";
num -= 100;
}
}else if(num>=50){
if(num>=90){
result += "XC";
num -= 90;
}else{
result += "L";
num -= 50;
}
}else if(num>=10){
if(num>=40){
result += "XL";
num -= 40;
}else{
result += "X";
num -= 10;
}
}else if(num>=5){
if(num>=9){
result += "IX";
num -= 9;
}else{
result += "V";
num -= 5;
}
}else{
if(num>=4){
result += "IV";
num -= 4;
}else{
result += "I";
num -= 1;
}
}
}
return result;
};
console.log(intToRoman(178));
console.log(intToRoman(89));
console.log(intToRoman(55));
console.log(intToRoman(1555));コードの解説
この関数では、まず1000以上かどうかを判定し、該当すれば「M」を追加します。次に500以上の場合は900以上なら「CM」、そうでなければ「D」を追加する、というように条件分岐を重ねていきます。各分岐で該当する記号を結果文字列に連結しつつ、その分だけ元の数値を減算することで、最終的に数値が0になりループが終了します。
例えば178を渡した場合、100 + 50 + 10×2 + 5 + 1×3 に分解され、「CLXXVIII」が出力されます。89であれば 50 + 30 + 9 に分解され、「LXXXIX」となります。
出力結果
このコードをコンソールで実行すると、次のような結果が得られます。
CLXXVIII LXXXIX LV MDLV
1555のように大きな数値でも問題なく変換できることが確認できます。このアルゴリズムは各桁の判定を1回ずつ行うだけで済むため、非常にシンプルかつ効率的に動作します。
-
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となる数値に