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

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

本記事では、C++を用いて、ある数値の中に特定の桁(数字)が何回出現するかを求める方法を解説します。

例として、数値が 12452321 であり、調べたい桁 D = 2 である場合を考えてみましょう。このとき、2は数値の中に3回現れるため、出現頻度は 3 となります。

解決のアプローチ

この問題は、次の手順でシンプルに解くことができます。

  1. 数値の最下位の桁(1の位)を剰余演算(% 10)によって取り出します。
  2. 取り出した桁が目的の数字 d と一致していれば、カウンタを1増やします。
  3. 数値を10で割ることで、処理済みの桁を取り除きます。
  4. 数値が0になるまで、上記の手順を繰り返します。

この方法の計算量は O(log₁₀ n)、つまり数値の桁数に比例するため、非常に効率的です。

サンプルコード

#include<iostream>
using namespace std;

int countDigitInNum(long long number, int d) {
    int count = 0;
    while(number){
        if((number % 10) == d)
            count++;
        number /= 10;
    }
    return count;
}

int main() {
    long long num = 12452321;
    int d = 2;
    cout << "Frequency of " << d << " in " << num << " is: " << countDigitInNum(num, d);
}

実行結果

Frequency of 2 in 12452321 is: 3

コードのポイント

number % 10 により、常に現在の最下位の桁を取得できます。
number /= 10 により、整数除算で最下位の桁が切り捨てられ、次の桁へ移動します。
・引数を long long 型にすることで、大きな数値にも対応できます。
・負の数を扱う場合は、事前に絶対値を取る(abs() を使う)などの工夫が必要です。

  1. C++で列車の停車駅の組み合わせ数を求める方法

    地点XとYの間にはn個の中間駅があるとします。ここで、「どの2つの停車駅も隣り合わない」という条件のもとで、s個の駅に停車する列車の配置方法が何通りあるかを求める問題を考えてみましょう。この記事では、停車駅の組み合わせ数を求めるためのアプローチを段階的に詳しく解説します。この問題は、本質的には組合せ論の問題であり、s個の停車駅の選び方の総数を求めることになります。 問題を解くアプローチ まず具体例として、中間駅が8個あり、そのうち3個の駅に停車させたい場合を考えてみます。 n = 8, s = 3 このとき、列車が停車できない駅は(n − s)、つまり5個残ることになります。 停車できない

  2. C++で集合の反射関係の数を求める方法

    この記事では、C++を使って集合上に定義できる反射関係(reflexive relation)の総数を求める方法について解説します。問題設定としては、整数 n が与えられたとき、n 個の自然数からなる集合上に存在する反射関係の個数を求めるというものです。 反射関係とは 集合 A 上の関係 R が反射的であるとは、「A に属するすべての要素 a に対して、順序対 (a, a) が必ず R に含まれる」という条件を満たすことを意味します。数式で表すと次のようになります。 (a, a) ∈ R (∀ a ∈ A) 具体的な入出力の例を見てみましょう。 入力 : x = 1 出力 : 1 説明 : 集