JavaScriptで2つの数値を加算する際に必要な繰り上がり(キャリー)の回数を求める方法
問題
2つの数値を受け取るJavaScriptの関数を記述する必要があります。
この関数は、まるで紙の上で筆算を行うように、その2つの数値を加算する際に発生する繰り上がり(キャリー)の回数を数えて返すものとします。
例えば、次の図のように 179 と 284 を足し合わせる場合、繰り上がりは2回発生します。したがって、この2つの数値を渡したとき、関数は 2 を返す必要があります。

解き方のポイント
この問題は、各桁を下の位から順番に見ていき、「その桁の2つの数字と、前の桁からの繰り上がりの合計が10以上になったかどうか」を判定することで解けます。
- 剰余演算子(%)を使えば、数値の一番下の桁(1の位)だけを取り出せます。
- 10で割って小数点以下を切り捨てることで、処理済みの桁を取り除き、次の桁へ進むことができます。
- 両方の数値が0になるまで(=すべての桁を処理し終えるまで)ループを続けます。
コード例
以下が実際のコードです −
const num1 = 179;
const num2 = 284;
const countCarries = (num1 = 1, num2 = 1) => {
let res = 0;
let carry = 0;
while(num1 + num2){
carry = +(num1 % 10 + num2 % 10 + carry > 9);
res += carry;
num1 = num1 / 10 | 0;
num2 = num2 / 10 | 0;
};
return res;
};
console.log(countCarries(num1, num2));
コードの解説
res: 繰り上がりが発生した合計回数を保持する変数です。carry: 現在の桁で繰り上がりが発生したかどうか(0または1)を表します。+(条件)の書き方により、条件が真なら1、偽なら0に変換されます。while(num1 + num2): 両方の数値が0になるまでループを継続します。これにより、すべての桁を確実に処理できます。num1 % 10 + num2 % 10 + carry > 9: 各桁の数字同士と前の繰り上がりを足して、10を超えるかどうかを判定しています。num1 / 10 | 0: 10で割った後、ビット演算子| 0で小数部分を切り捨て、次の桁へ移動します。
出力
コンソールには次の出力が表示されます −
2
このように、179 + 284 = 463 の計算では、1の位(9 + 4)と十の位(7 + 8 + 繰り上がり1)の2箇所で繰り上がりが発生するため、正しく 2 が出力されます。
-
JavaScriptで0からnまで数えるときに「9」が出現する回数を数える方法
問題 数値 n を引数として受け取るJavaScript関数を作成します。この関数は、0からnまで順番に数えていく過程で、数字の「9」が何回登場するかを数え、その合計回数を返す必要があります。 解決のアプローチ この問題は、次の手順でシンプルに解決できます。 0からnまでの各数値を文字列に変換する 変換した文字列の中に「9」が何文字含まれているかを調べる すべての数値分のカウントを合計して返す 文字列内の特定の文字を数えるには、split() で1文字ずつ分解し、reduce() を使って一致する文字をカウントする方法が有効です。 コード例 以下が実際のコードです。 const num
-
JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法
問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に