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

C++で1からnまでの数のうち、数字「4」を含む数を数える方法

このチュートリアルでは、1からnまでの整数の中に、数字「4」が含まれる数がいくつあるかを求めるプログラムについて解説します。

具体的には、ある数nが与えられたとき、その範囲内で「4」という桁を少なくとも1つ持つすべての数を数え上げ、その個数を出力するのが目的です。

アルゴリズムの考え方

この問題はシンプルなアプローチで解くことができます。

まず、1からnまでの各数値に対して、「4」という桁が含まれているかどうかを判定します。判定には、数値を10で割った余り(最下位の桁)を順番に確認していく方法を使います。もし余りが4であれば、その数には「4」が含まれていると判断できます。桁の確認が終わるまで、数値を10で割り続けることで、すべての桁を調べることが可能です。

次に、条件を満たす数を見つけるたびにカウントを増やし、最終的な合計を結果として返します。

実装例

以下に、C++での実装例を示します。

#include<iostream>
using namespace std;
bool has4(int x);
// 1からnまでの数のうち、4を含む数の合計を返す
int get_4(int n){
    int result = 0;
    // 各数値について判定を行う
    for (int x=1; x<=n; x++)
        result += has4(x)? 1 : 0;
    return result;
}
// 数字「4」が含まれているかどうかをチェックする
bool has4(int x) {
    while (x != 0) {
        if (x%10 == 4)
            return true;
        x = x /10;
    }
    return false;
}
int main(){
    int n = 328;
    cout << "Count of numbers from 1 to " << n
        << " that have 4 as a digit is "
        << get_4(n) << endl;
    return 0;
}

出力結果

Count of numbers from 1 to 328 that have 4 as a digit is 60

この例では、1から328までの範囲に「4」を含む数は60個存在することがわかります。

処理の流れのポイント

  • has4関数:引数として受け取った数値の各桁を下の桁から順に確認し、「4」が見つかった時点でtrueを返します。最後まで見つからなければfalseを返します。
  • get_4関数:1からnまでループを回し、has4関数の結果がtrueであればカウントを1ずつ加算していきます。

この方法の計算量はO(n × 桁数)となるため、nが非常に大きい場合には効率化の余地がありますが、基本的な桁操作の練習としては非常に分かりやすい実装です。

  1. C++で0を含むd桁の正の整数を数える方法

    本記事では、数字の「0」を含むd桁の正の整数の個数を求めるプログラムについて、C++を用いて解説します。 問題概要 整数「d」が与えられます。「0」を少なくとも1つの桁として含むd桁の正の整数が全部でいくつあるかを数え、出力することが課題です。 アルゴリズム(考え方) この問題は、すべての数を実際に列挙しなくても、組み合わせの考え方を使えば簡単に求められます。 d桁の正の整数の総数:先頭の桁は1〜9の9通り、残りの(d−1)桁はそれぞれ0〜9の10通りなので、9 × 10(d−1) 個 0をまったく含まないd桁の正の整数:各桁がすべて1〜9のいずれかになるため、9d 個 したがって、0を

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