C++でK番目のブーム数を求めるアルゴリズムと実装方法
はじめに
このチュートリアルでは、C++を使って「k番目のブーム数」を見つけるプログラムを作成します。
ブーム数とは、数字の2と3のみで構成される数のことです。たとえば、2、3、22、23、32、33、222などが該当します。
アルゴリズムの手順
この問題は、キュー(queue)を活用した幅優先探索(BFS)の考え方で効率よく解くことができます。具体的な手順は以下の通りです。
- 変数kの値を初期化します。
- 文字列型のキューを用意します。
- 空文字列をキューに追加します。
- カウンター変数を0で初期化します。
- カウンターがkに達するまで、以下の処理を繰り返すループを作成します。
- キューの先頭要素を取得し、キューから取り出します。
- 先頭要素を別の変数に保存しておきます。
- 保存した文字列の末尾に「2」を付けた数をキューに追加します。
- カウンターを1増やし、kと一致した場合はその値を出力して処理を終了します。
- 同様に、末尾に「3」を付けた数をキューに追加します。
- カウンターを増やし、kと一致した場合は値を出力して終了します。
この手法により、桁数が小さいものから順に、また同じ桁数内では昇順にブーム数を生成できるため、k番目の数を確実に求められます。
実装例
それでは、実際のコードを見てみましょう。
#include<bits/stdc++.h>
using namespace std;
void findKthBoomNumber(long long k) {
queue<string> queue;
queue.push("");
long long count = 0;
while (count <= k) {
string numberOne = queue.front();
queue.pop();
string numberTwo = numberOne;
queue.push(numberOne.append("2"));
count++;
if (count == k) {
cout << numberOne << endl;
break;
}
queue.push(numberTwo.append("3"));
count++;
if (count == k) {
cout << numberTwo << endl;
break;
}
}
}
int main() {
long long k = 45;
findKthBoomNumber(k);
return 0;
}
出力結果
上記のコードを実行すると、次のような結果が得られます。
23332
コードのポイント
このコードでは、キューから取り出した文字列をもとに、「2」を付けた数と「3」を付けた数の2つを順番に生成しています。文字列として扱うことで、非常に大きな桁数のブーム数にも対応できる点が特徴です。なお、出力時にはlong long型の範囲を超える可能性があるため、string型のまま扱うのが安全です。
まとめ
本記事では、キューを用いた幅優先探索の考え方により、k番目のブーム数を求める方法を解説しました。本チュートリアルについてご質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の