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

C++で指定した数字dを含む数値をすべて検索する方法

問題の概要

数字 d と上限値 n が与えられたとき、0 から n までの範囲に存在する、数字 d を含むすべての数値を見つけることを考えます。

例えば、n = 20、d = 3 の場合、該当する数値は [3, 13] の2つになります。また、n = 100、d = 3 の場合は、3、13、23、30〜39、43、53 といった具合に、3 が現れるすべての数値が該当します。

解決のアプローチ

この問題は、各数値を文字列に変換することでシンプルに解決できます。手順は以下のとおりです。

1. 各数値を to_string() で文字列に変換する
2. 変換した文字列の中に、対象の数字 d が含まれているかを find() で確認する
3. 含まれていればその数値を出力し、含まれていなければ無視する

サンプルコード

#include<iostream>
using namespace std;

int getAllNumWithDigit(int n, int d) {
    string str = "";
    str += to_string(d);
    char ch = str[0];   // 対象の数字を文字として保持
    string p = "";
    p += ch;

    for (int i = 0; i <= n; i++) {
        str = "";
        str = str + to_string(i);   // 各数値を文字列に変換
        int index = str.find(p);    // 数字 d が含まれるか検索
        if (i == d || index != -1)
            cout << (i) << " ";
    }
}

int main() {
    int n = 100; int d = 3;
    getAllNumWithDigit(n, d);
}

実行結果

3 13 23 30 31 32 33 34 35 36 37 38 39 43 53 63 73 83 93

コードのポイント

この実装では、対象の数字 d をあらかじめ文字型(char)に変換して保持しておき、ループ内で各数値を文字列化してから find() 関数で部分一致を調べています。find() は該当する文字が見つかった場合にその位置を返し、見つからない場合は -1 を返すため、戻り値が -1 以外であれば「数字 d を含む数値」と判断できます。

計算量は、0 から n までの各数値に対して文字列変換と検索を行うため、O(n × log₁₀n) 程度となります。桁数が限られている実用的な範囲では十分に高速に動作します。

なお、文字列を使わずに各桁を % 10/ 10 で分解して判定する方法もありますが、文字列変換を利用するこの方法はコードが簡潔で読みやすく、実装ミスも起こりにくいのが利点です。

  1. C++で配列内の数値の頻度(出現回数)を求める方法

    配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で

  2. C++で数値内の特定の桁の出現頻度を求める方法

    本記事では、C++を用いて、ある数値の中に特定の桁(数字)が何回出現するかを求める方法を解説します。 例として、数値が 12452321 であり、調べたい桁 D = 2 である場合を考えてみましょう。このとき、2は数値の中に3回現れるため、出現頻度は 3 となります。 解決のアプローチ この問題は、次の手順でシンプルに解くことができます。 数値の最下位の桁(1の位)を剰余演算(% 10)によって取り出します。 取り出した桁が目的の数字 d と一致していれば、カウンタを1増やします。 数値を10で割ることで、処理済みの桁を取り除きます。 数値が0になるまで、上記の手順を繰り返します。 この方