C++で桁の合計がYと等しくなる範囲[L, R]内の数値の個数を求める方法
2つの整数START(開始)とEND(終了)が与えられ、これらによって数値の範囲が定義されます。この記事のゴールは、範囲[START, END]内に含まれる数値のうち、各桁の合計が指定された値Yと一致するものをすべて見つけ出すことです。
解法はシンプルです。STARTからENDまでの数値を1つずつ走査し、それぞれの数値に対してwhileループを使って桁の合計を計算します。その合計がYと一致していればカウントを1増やし、すべての数値を調べ終えたときのカウントが答えとなります。
具体例を見てみましょう。
入力
START=10 END=20 Y=4
出力
桁の合計がYと等しい数値の個数: 1
説明
数値13の各桁の合計は 1+3=4 となり、Yと一致します。
入力
START=10 END=50 Y=5
出力
桁の合計がYと等しい数値の個数: 5
説明
14、23、32、41、50 の5つの数値は、いずれも桁の合計が5です。
プログラムで使用するアプローチ
整数START、END、Yを入力として受け取ります。
関数digitSum(int start, int end, int y)は、桁の合計がyと等しい数値の個数を返します。
該当する数値を数えるための変数countを0で初期化します。
桁の合計を一時的に保持する変数digsumを0で初期化します。
forループを使って、i=startからi=endまで範囲内の数値を順に走査します。
各数値num=iに対して、whileループで「numが0より大きい間」処理を繰り返します。
digsum += num % 10 で最下位の桁を合計に加算し、num = num / 10 として次の桁へ進みます。
whileループを抜けたら、digsum == y であるかを判定し、真であればcountをインクリメントします。
すべてのループが完了した時点で、countには条件を満たす数値の総数が格納されています。
最後にcountを結果として返します。
コード例
#include <bits/stdc++.h>
using namespace std;
// 桁の合計がyと等しい数値の個数を返す関数
int digitSum(int start, int end, int y){
int count = 0;
int digsum = 0;
for (int i = start; i <= end; i++){
int num = i;
digsum = 0;
while(num > 0){
digsum += num % 10; // 各桁の合計を計算
num = num / 10;
}
if(digsum == y){ // 元の数値はi
count++;
// cout << i << " ";
}
}
return count;
}
int main(){
int START = 100;
int END = 1000;
int Y = 5;
cout << "桁の合計がYと等しい数値の個数: " << digitSum(START, END, Y);
return 0;
}出力
上記のコードを実行すると、次のような出力が得られます。
桁の合計がYと等しい数値の個数: 15
この実行例では、100から1000までの範囲内に、桁の合計が5になる数値が15個存在することがわかります。計算量は範囲の大きさに比例するため、STARTとENDの差が小さい場合は非常に効率的に動作します。
-
C++で1からNまでの準素数(Almost Prime)の個数を求める方法
ある数 N が与えられたとき、1からNまでの範囲に含まれる「準素数(almost prime)」の個数を求める問題を考えてみましょう。準素数とは、異なる素因数をちょうど2つ持つ数のことです。素因数以外の約数(合成数の約数)はいくつあっても構いませんが、その中に含まれる素因数は正確に2種類である必要があります。例えば、Nが10の場合、出力は2になります。これは、条件を満たす数が 6(= 2 × 3)と 10(= 2 × 5)の2つしか存在しないためです。アプローチ:エラトステネスの篩を活用するこの問題を効率的に解くには、エラトステネスの篩(Sieve of Eratosthenes)を使って素数
-
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 +