JavaScriptで数値を展開形式(位ごとの分解表記)に変換する方法
はじめに
本記事では、JavaScriptを使って数値を「展開形式(拡張形式)」と呼ばれる文字列に変換する方法を解説します。展開形式とは、各桁の数字をその位の値(けたの重み)ごとに分解して表記する形式のことです。たとえば 56577 という数値は、次のように表されます。
50000 + 6000 + 500 + 70 + 7
問題の概要
求められているのは、1つの数値を受け取り、その数値の展開形式を示す文字列を返すJavaScript関数です。この処理を実現するポイントは以下の通りです。
- 数値を文字列化して、1桁ずつ取り出せるようにする
- 各桁に対応する位の値(10のべき乗)を計算する
- 値が 0 の桁は結果から除外し、有効な桁だけを「 + 」で連結する
実装コード
以下が実際のコード例です。
const num = 56577;
const expandedForm = (num = 0) => {
const str = String(num);
let res = '';
let multiplier = Math.pow(10, str.length - 1);
for(let i = 0; i < str.length; i++){
const el = +str[i];
const next = +str[i + 1];
if(el){
res += (el * multiplier);
};
if(next){
res += ' + ';
};
multiplier /= 10;
};
return res;
};
console.log(expandedForm(num));コードの解説
処理の流れ
- 数値の文字列化:
String(num)で数値を文字列に変換し、インデックスアクセスで各桁を扱えるようにします。 - 初期の倍率を設定:
Math.pow(10, str.length - 1)により、最上位桁の位の値(例:5桁なら10000)を取得します。 - ループで各桁を処理: 各桁の数字
elを数値化し、multiplierを掛けることでその位の値を算出します。 - ゼロの除外と連結制御: 桁の値が 0 の場合は結果に加えません。また、次の桁に有効な値が存在する場合のみ
' + 'を付与することで、末尾に余計な記号が残るのを防いでいます。 - 倍率の更新: ループの最後で
multiplier /= 10として、次の桁へ向けて位の値を1/10に縮小していきます。
出力結果
上記のコードを実行すると、コンソールには次のように表示されます。
50000 + 6000 + 500 + 70 + 7
このように、元の数値 56577 が各桁の位の値に分解された形式で出力されていることが確認できます。なお、56577 には 0 の桁が含まれていませんが、例えば 50607 のような数値の場合でも、このアルゴリズムは 0 の桁を自動的にスキップして 50000 + 600 + 7 を返すため、あらゆる整数に対して正しく動作します。
まとめ
数値を文字列として扱い、10のべき乗を用いた倍率と組み合わせることで、シンプルなループ処理だけで数値の展開形式を生成できます。位の概念をプログラム的に扱う良い練習になるため、JavaScriptの学習課題としてもおすすめの題材です。
-
JavaScriptで数値の桁を並べ替えて最大値を作る方法
この記事では、与えられた整数の各桁を並べ替えて、表現できる最大の数を求めるJavaScript関数の実装方法を解説します。問題数値 n を引数として受け取るJavaScript関数を用意します。この関数は、n の各桁を自由に入れ替えることで作れる最大の値を返す必要があります。たとえば「124」という数値の場合、各桁(1・2・4)を大きい順に並べ替えることで、最大値である「421」が得られます。アプローチ:大きい桁を左に置く最大の数を作るための基本戦略はシンプルで、「大きな数字ほど上位の桁(左側)に配置する」ことです。これを実現するために、次の手順で処理を行います。数値を文字列に変換し、1桁ずつ
-
JavaScriptで数値の階乗の桁数を求める方法
問題JavaScriptで、数値 num を唯一の引数として受け取る関数を作成することを考えます。この関数は、num の階乗(n!)が何桁になるかを計算し、その桁数を返す必要があります。たとえば、関数への入力が次のような場合を考えてみましょう。入力const num = 7;出力const output = 4;出力の解説7! = 5040 であり、5040は4桁の数字であるため、結果は 4 となります。アプローチ:対数を使った賢い計算方法一見すると、階乗を直接計算して文字列の長さを数えればよさそうに思えます。しかし、階乗は極めて急激に増加するため、少し大きな数でもすぐにJavaScriptの