【JavaScript】偶数・奇数位置の桁の合計が指定の数で割り切れるn桁の数をすべて見つける方法
3つの数値を受け取るJavaScript関数を作成する必要があります。ここでは、それらの数値を a、b、n と呼ぶことにします。
私たちの課題は、偶数番目の位置にある桁の合計が a で割り切れ、かつ奇数番目の位置にある桁の合計が b で割り切れる、すべての n 桁の数を見つけることです。最後に、条件を満たすすべての数値を格納した配列を返却します。該当する数値がひとつも存在しない場合は、空の配列を返します。
なお、この記事では「位置」は数値の右端(一の位)をインデックス 0 として、右から左へ数えていくものとします。
アプローチ
この問題は、以下の3つの関数に役割を分けて考えると理解しやすくなります。
- indexSum(): 数値の各桁を右から順に再帰的に走査し、偶数インデックス(0, 2, 4…)の桁の合計 sumEven と、奇数インデックス(1, 3, 5…)の桁の合計 sumOdd をオブジェクトとして返します。
- divides(): ある数がもう一方の数で割り切れるかどうかをブール値で判定する、シンプルなヘルパー関数です。
- countNum(): n 桁の最小値(10n-1)から最大値(10n − 1)までのすべての整数をループで確認し、両方の条件を満たすものだけを結果配列 res に追加して返します。
コード例
以下が実際の実装例です。
const indexSum = (num, sumOdd = 0, sumEven = 0, index = 0) => {
if (num) {
if (index % 2 === 0) {
sumEven += num % 10;
} else {
sumOdd += num % 10;
}
return indexSum(Math.floor(num / 10), sumOdd, sumEven, ++index);
}
return { sumOdd, sumEven };
};
const divides = (b, a) => a % b === 0;
const countNum = (n, first, second) => {
let start = Math.pow(10, (n - 1));
const end = Math.pow(10, n) - 1;
const res = [];
while (start <= end) {
const { sumEven, sumOdd } = indexSum(start);
const condition = divides(first, sumEven) && divides(second, sumOdd);
if (condition) {
res.push(start);
}
start++;
}
return res;
};
console.log(countNum(3, 5, 3));
出力
このコードをコンソールで実行すると、次のような出力が得られます。
[ 104, 109, 134, 139, 164, 169, 194, 199, 203, 208, 233, 238, 263, 268, 293, 298, 302, 307, 332, 337, 362, 367, 392, 397, 401, 406, 431, 436, 461, 466, 491, 496, 500, 505, 530, 535, 560, 565, 590, 595, 604, 609, 634, 639, 664, 669, 694, 699, 703, 708, 733, 738, 763, 768, 793, 798, 802, 807, 832, 837, 862, 867, 892, 897, 901, 906, 931, 936, 961, 966, 991, 996 ]
コードの解説
ここでは countNum(3, 5, 3) を呼び出しています。これは「3桁の数(100〜999)の中から、偶数位置(一の位・百の位)の桁の合計が 5 で割り切れ、かつ奇数位置(十の位)の桁の合計が 3 で割り切れるものをすべて求める」という意味になります。
例えば、結果の先頭にある 104 のケースを見てみましょう。
- 偶数位置(インデックス 0 と 2)の桁は 4 と 1 なので、合計は 4 + 1 = 5 → 5 で割り切れます。
- 奇数位置(インデックス 1)の桁は 0 なので、合計は 0 → 3 で割り切れます。
したがって、104 は条件を満たす数として結果に含まれます。同様のチェックが n 桁の全範囲に対して繰り返し行われ、条件を満たすすべての数が配列に収集されて返されます。
-
C++で[L, R]の範囲内にある「桁の合計が3で割り切れる」偶数の個数を求める方法
2つの整数 L と R が与えられ、範囲 [L, R] を定義します。この記事の目的は、L から R までの間に存在する偶数の中で、各桁の合計が3で割り切れる数の個数を求めることです。実現方法としては、L から R までのすべての偶数について桁の合計を計算し、その合計が3で割り切れる(sum % 3 == 0)場合にカウントを1つずつ増やしていきます。具体例で理解しましょう。例1入力 − L=10, R=20出力 − 範囲 [L, R] 内で桁の合計が3で割り切れる偶数の個数:2説明 − 10 から 20 の間の偶数は、10, 12, 14, 16, 18, 20 の6つです。このうち桁の合計
-
Pythonで整数リストの偶数桁・奇数桁の合計を求める方法
整数リスト内のすべての偶数桁と奇数桁の合計を求めたい場合、シンプルなループ処理と剰余演算子(%)を組み合わせることで実現できます。各数字を文字列として取り出し、2で割った余りが0かどうかを判定することで、偶数か奇数かを区別します。以下に具体的なサンプルコードを示します。サンプルコードmy_list = [369, 793, 2848, 4314, 57467] print(The list is :) print(my_list) sum_odd = 0 sum_even = 0 for index in my_list: for element in str(index):