【JavaScript】偶数・奇数番目の桁の合計が指定した数で割り切れるN桁の数の個数を求める方法
本記事では、3つの引数 A、B、N を受け取るJavaScript関数を作成します。この関数は、偶数番目の桁の合計が A で割り切れ、かつ奇数番目の桁の合計が B で割り切れるN桁の整数が全部でいくつ存在するのかを求めます。
問題の考え方
ここでの「位置」とは、右端の桁をインデックス0として数えたものです。たとえば2桁の数「35」の場合、一の位の「5」がインデックス0(偶数)、十の位の「3」がインデックス1(奇数)に相当します。
条件を満たす数を見つけるには、対象となる範囲内のすべての数に対して次の手順を実行します。
- 各桁を偶数インデックス用と奇数インデックス用に分けて合計する
- 偶数インデックスの桁の合計が A で割り切れるかを判定する
- 奇数インデックスの桁の合計が B で割り切れるかを判定する
- 両方の条件を満たす場合のみ、その数を結果として記録する
コード例
それでは、実際のコードを見てみましょう。
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(2, 5, 3));
出力結果
コンソールには以下のように表示されます。
[ 30, 35, 60, 65, 90, 95 ]
コードの解説
indexSum関数
indexSum関数は再帰的に呼び出され、数値を下の桁から順に処理します。現在のインデックスが偶数であれば偶数用の合計に、奇数であれば奇数用の合計に、その桁の値を加算していきます。すべての桁を処理し終えると、両方の合計をまとめたオブジェクトを返します。
divides関数
divides関数は、第2引数 a が第1引数 b で割り切れるかどうかを真偽値で返すシンプルなヘルパー関数です。
countNum関数
countNum関数は、N桁の数値の範囲(10N-1 から 10N−1 まで)を順番に走査し、indexSumで取得した各合計が条件を満たすかどうかを判定します。条件を満たした数だけを配列に格納し、最後にその配列を返します。
今回の例では countNum(2, 5, 3) を呼び出しているため、「一の位(偶数インデックス)が5で割り切れ、かつ十の位(奇数インデックス)が3で割り切れる」2桁の数、すなわち 30、35、60、65、90、95 の6つが出力されます。
補足:計算量に関する注意点
この実装はシンプルで理解しやすい反面、総当たり(ブルートフォース)方式のため、Nが大きくなると処理時間が急激に増加します。大きなNを扱う必要がある場合は、動的計画法(DP)を用いて桁ごとの状態を管理するアプローチを採用すると、大幅に効率化できます。
-
Pythonで偶数桁の数字の積が奇数桁の数字の合計で割り切れるか判定する方法
ある数値 n が与えられたとき、偶数番目の桁にある数字の積が奇数番目の桁にある数字の合計で割り切れるかどうかを判定します。ここで、桁の位置は右から左へ数え始め、いちばん右の桁を1桁目とします。 問題の例 たとえば、入力が n = 59361 の場合を考えてみましょう。 偶数桁(2桁目・4桁目)の数字は「6」と「9」→ 積は 6 × 9 = 54 奇数桁(1桁目・3桁目・5桁目)の数字は「1」「3」「5」→ 合計は 1 + 3 + 5 = 9 54 ÷ 9 = 6 となり余りが出ないため、この場合の出力は True になります。 解法のアプローチ この問題は、次の手順で解くことができます。
-
Pythonでリスト内の偶数と奇数をカウントする3つの方法を解説
この記事では、リスト内に含まれる偶数と奇数の個数を数える方法について、具体的なコード例とともに解説します。問題の概要課題: 与えられたリストの中から、偶数と奇数がそれぞれいくつ含まれているかをカウントします。ここでは、以下の3つのアプローチを紹介します。それぞれ特徴が異なるため、用途やコードの可読性に応じて使い分けるのがおすすめです。方法1:forループを使った基本的な方法(総当たり方式)最もシンプルで直感的な方法です。拡張forループで各要素を順番に確認し、2で割った余りによって偶数か奇数かを判定します。コード例list1 = [21, 3, 4, 6, 33, 2, 3, 1, 3, 76