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つです。このうち桁の合計が3で割り切れるのは、12(1+2=3)と 18(1+8=9)の2つです。
例2
入力 − L=100, R=108
出力 − 範囲 [L, R] 内で桁の合計が3で割り切れる偶数の個数:2
説明 − 100 から 108 の間の偶数は、100, 102, 104, 106, 108 の5つです。このうち桁の合計が3で割り切れるのは、102(1+0+2=3)と 108(1+0+8=9)の2つです。
プログラムで使用するアプローチ
範囲を定義するために変数 first と last を使用します。
関数 Digit_sum(int num) は数値を受け取り、その桁の合計を返します。
while ループを使い、num != 0 である限り、num % 10(一の位の数字)を total に加算します。
num を10で割ることで、処理済みの桁を取り除いていきます。
ループ終了時には total にすべての桁の合計が格納されます。
関数 divisible_3(int first, int last) は数値の範囲を受け取り、桁の合計が3で割り切れる偶数の個数を返します。
i = first から i <= last まで繰り返し、数値 i が偶数かどうか(i % 2 == 0)を確認します。
条件が真の場合、Digit_sum(i) を呼び出して i の桁の合計を計算し、その合計が3で割り切れる場合はカウントを増やします。
for ループの終了後、結果として count を返します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int Digit_sum(int num){
int total = 0;
while (num!= 0){
total += num % 10;
num = num / 10;
}
return total;
}
int divisible_3(int first, int last){
int count = 0;
for (int i = first; i <= last; i++){
if (i % 2 == 0 && Digit_sum(i) % 3 == 0){
count++;
}
}
return count;
}
int main(){
int first = 300, last = 500;
cout<<"Count of all even numbers in the range [L, R] whose sum of digits is divisible by 3 are: "<<divisible_3(first, last);
return 0;
}出力結果
上記のコードを実行すると、次の出力が生成されます −
Count of all even numbers in the range [L, R] whose sum of digits is divisible by 3 are: 34
このように、300 から 500 の範囲内には、桁の合計が3で割り切れる偶数が34個存在することがわかります。時間計算量は O(N × d)(N は範囲の大きさ、d は桁数)となり、シンプルで直感的な実装になっています。
-
C++で配列内の最長の連続する偶数の個数を求める方法
要素数 n の配列 A が与えられたとき、その中に含まれる「連続した偶数」の最大個数を求める問題を考えてみましょう。例えば、配列が A = [1, 2, 3, 4, 6, 8, 7] の場合、4・6・8 と偶数が3つ続いているため、答えは 3 となります。アルゴリズムの考え方この問題は非常にシンプルな方法で解くことができます。ポイントは2つのカウント変数を用意することです。max_current: 現在進行中の連続する偶数の個数max_till_now: これまでに見つかった最大の連続偶数の個数配列を先頭から順に走査し、偶数を見つけたら max_current を1増やして、max_till_
-
C++で桁の合計に基づいて数値をソートする方法
この記事では、各数値の「桁の合計(各桁の数字を足した値)」に基づいて数値を並べ替える方法を解説します。桁の合計が小さい数値ほど先頭に配置され、合計が大きい数値ほど後ろに配置されます。ソートの例例として、次のようなデータを考えてみましょう。data = {14, 129, 501, 23, 0, 145}このデータを桁の合計順にソートすると、以下のようになります。0 → 桁の合計は 014 → 桁の合計は 1 + 4 = 523 → 桁の合計は 2 + 3 = 5501 → 桁の合計は 5 + 0 + 1 = 6145 → 桁の合計は 1 + 4 + 5 = 10129 → 桁の合計は 1 +