C++
 Computer >> コンピューター >  >> プログラミング >> C++

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の差が小さい場合は非常に効率的に動作します。

  1. 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)を使って素数

  2. 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 +