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

C++で0が奇数個含まれるN桁の数を数える方法


整数 N が入力として与えられます。目的は、各桁に含まれる 0 の個数が奇数となる N 桁の数が全部でいくつあるかを求めることです。ここでは先頭の 0 も有効な桁として扱います。たとえば N=3 の場合、000、011、012、…、990 のような数もカウント対象に含まれます。

具体例を使って理解しましょう。

入力 − N=3

出力 − 0 が奇数個含まれる N 桁の数の個数 − 244

説明 − 3 桁の数は次のような並びになります。

最小は 000、続いて 011、012、013、014、…、最大は 990。

入力 − N=5

出力 − 0 が奇数個含まれる N 桁の数の個数 − 33616

説明 − 5 桁の数は次のような並びになります。

最小は 00000、続いて 00011、00012、00013、00014、…、最大は 99990。

プログラムで使用するアプローチ

まず、先頭の 0 を含む N 桁の数の総数を T = 10N とします。次に、二項定理の性質を利用すると、「0 が偶数個含まれる数の個数」と「0 が奇数個含まれる数の個数」の差が 8N になることが分かります。したがって、求めたい「0 が奇数個含まれる数」の個数は (T − 8N) / 2 として計算できます。

  • 整数 N を入力として受け取ります。

  • 関数 count_odd(int N) は N を受け取り、0 が奇数個含まれる N 桁の数の個数を返します。

  • N 桁の数の総数は total = pow(10, N) で計算します。

  • 偶数個の場合と奇数個の場合の個数の差は diff = pow(8, N) で計算します。

  • 0 が奇数個含まれる数の個数は odd = (total − diff) / 2 となります。

  • odd を「0 が奇数個含まれる N 桁の数の個数」として返します。

このアルゴリズムのポイント

すべての数を実際に列挙して 0 の個数を数える代わりに、数学的な性質を利用することで、pow の計算だけで即座に答えを求められる点が大きな魅力です。そのため N が大きくなっても高速に動作します。

#include <bits/stdc++.h>
using namespace std;
int count_odd(int N){
    int total = pow(10, N);
    int diff = pow(8, N);
    int odd = (total - diff) / 2;
    return odd;
}
int main(){
    int N = 4;
    cout<<"Count of Numbers with N digits which consists of odd number of 0's are: "<<count_odd(N);
return 0;
}

出力

上記のコードを実行すると、次の出力が得られます −

Count of Numbers with N digits which consists of odd number of 0's are: 2952

  1. 【C++】Dで割り切れるN桁の数を見つけるアルゴリズム

    2つの整数 N と D が与えられたとき、D で割り切れる N 桁の数を見つける問題を考えます。例えば、N = 3、D = 5 の場合、答えは 500 になります。一見難しそうに思えるこの問題ですが、実はとてもシンプルな発想で解決できます。解法のアイデア基本となる考え方は、「D を先頭に置き、その後ろに 0 を付け足して N 桁にする」というものです。D の桁数を m とすると、D の末尾に (N − m) 個の 0 を連結した数は、全体でちょうど N 桁となり、必ず D で割り切れます。これは、作成される数が D × 10(N−m) に相当し、10 のべき乗を掛けても D で割り切れるという

  2. Pythonで偶数桁の数字を数える方法

    数値のリストが与えられたとき、桁数が偶数である数字の個数を数える問題を考えてみましょう。 例えば、配列が [12, 345, 2, 6, 7896] の場合を想定します。「12」は2桁、「7896」は4桁なので桁数が偶数です。一方、「345」「2」「6」は桁数が奇数のため対象外となります。したがって、この場合の出力は 2 になります。 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 リストを受け取り、各整数を文字列に変換する 変換後の文字列の長さ(=桁数)が偶数であれば、カウントを1つ増やす すべての要素を処理したら、最終的なカウント値を返す 実装例 それでは、