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

C++でN未満のすべての数を最大2種類の一意な数字で出力する方法

この問題では、整数Nが与えられ、N未満のすべての数のうち、最大2種類の異なる数字(ユニークな数字)のみを使用して構成される数を出力します。つまり、1つの数を作るために使える数字の種類は最大2つまでという制限があります。

問題を理解するために、具体例を見てみましょう。

入力: N = 17
出力: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

この例では、17未満の数はすべて1種類または2種類の数字で構成されているため、すべてが出力対象となります。

解法のアプローチ

この問題を解くには、2種類のユニークな数字のみで構成されるすべての数を生成します。数の生成プロセスは0から始まり、生成された数がN以上になった時点で終了します。

選択した2つの数字をiとjとすると、num*10+inum*10+j を使って再帰的に数を生成していきます。この過程では、同じ数が複数回生成される可能性があります。そこで、setを使用して数を格納することで、重複を自動的に排除できます。

アルゴリズムの手順

  1. 0から9までの数字からペア(i, j)をすべて列挙します。
  2. 各ペアについて、num*10+i と num*10+j で数を再帰的に生成します。
  3. 生成した数が0より大きくN未満であれば、setに追加します。
  4. 最後にsetの内容を昇順で出力します。

実装例

以下のプログラムは、上記のアプローチを実装したものです。

#include <bits/stdc++.h>
using namespace std;
set<int> numbers;
void generateNumbers(int n, int num, int i, int j){
   if (num > 0 && num < n)
      numbers.insert(num);
   if (num >= n)
      return;
   if (num*10+i > num)
      generateNumbers(n, num*10+i, i, j);
   generateNumbers(n, num*10+j, i, j);
}
void printUniqueBitNumber(int n){
   for (int i = 0; i <= 9; i++)
      for (int j = i + 1; j <= 9; j++)
         generateNumbers(n, 0, i, j);
   cout<<"The numbers are generated are : ";
   while (!numbers.empty()) {
      cout<<*numbers.begin()<<" ";
      numbers.erase(numbers.begin());
   }
}
int main(){
   int n = 17;
   printUniqueBitNumber(n);
   return 0;
}

出力結果

The numbers are generated are : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  1. C++で最小ヒープから値x未満のすべてのノードを出力する方法

    この問題では、最小ヒープ(Min Heap)と値xが与えられ、xより小さい値を持つすべてのノードを出力することが求められます。最小ヒープとは、すべての親ノードがその子ノードの値以下となる特殊な二分木です。この性質により、根(ルート)には常にヒープ内の最小値が格納されます。具体例を使って問題を理解しましょう。X = 45出力 − 2 4 7 10 17 22 33 34この問題を解くには、最小ヒープ全体を先行順トラバーサル(前順走査)で探索し、与えられた値xより小さい値を持つノードのみを出力します。アルゴリズムのポイント最小ヒープでは親ノードの値が必ず子ノード以下であるため、あるノードの値がx以

  2. C++でn以下のすべての階乗数を効率的に求める方法

    本記事では、C++を使ってn以下のすべての階乗数を出力する方法を解説します。 階乗数とは 階乗数(factorial number)とは、ある正の整数の階乗として表せる数のことです。たとえば、1! = 1、2! = 2、3! = 6、4! = 24、5! = 120 となるため、1、2、6、24、120 はいずれも階乗数に該当します。 アルゴリズムの考え方 n以下の階乗数を求める際、毎回ゼロから階乗を計算し直す必要はありません。初期値として fact = 1 を用意し、変数 i を 2 から順に増やしながら fact に i を掛けていくだけで、1!、2!、3!、… と次々に求められます。fa