C++で数字{0, 1, 2, 3, 4, 5}のみを使って作られるn番目の数を求める方法
数字 {0, 1, 2, 3, 4, 5} のみを使用して作られる数を小さい順に並べると、次のような数列になります。
0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, ...
この数列は、最初の6つの数字をもとに、「既存の数 × 10 + 各数字」というシンプルなパターンを繰り返すことで生成できます。具体的な生成過程を見てみましょう。
1 * 10 + 0 = 10 1 * 10 + 1 = 11 1 * 10 + 2 = 12 1 * 10 + 3 = 13 1 * 10 + 4 = 14 1 * 10 + 5 = 15
同じ要領で、2、3、4、5 に対してもこのパターンを適用すれば、それぞれ続く6個ずつの数(20〜25、30〜35、40〜45、50〜55)が得られます。さらにその先の数も、同じ手順を繰り返すことで順番に求められます。
アルゴリズム
- 整数 n を初期化します。
- 結果を格納するためのベクターを用意します。
- 0 から 5 までのループで、最初の6個の数をベクターに追加します。これで数列の最初の6項が揃います。
- 次に、0 から n / 6 までのループを実行します。
- さらにその内側で 0 から 5 までのループを実行し、「既存の数 × 10 + 数字」のパターンを適用して残りの数を生成します。
- 生成した数を順次ベクターに追加していきます。
- 最後に、ベクターから n 番目の数を取り出して返します。
C++での実装
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
int findNthNumber(int n) {
vector<int> numbers;
// 最初の6個の数(0〜5)を追加
for (int i = 0; i < 6; i++) {
numbers.push_back(i);
}
// 既存の数をもとに残りの数を生成
for (int i = 0; i <= n / 6; i++) {
for (int j = 0; j < 6; j++) {
if ((numbers[i] * 10) != 0) {
numbers.push_back(numbers[i] * 10 + numbers[j]);
}
}
}
return numbers[n - 1];
}
int main() {
int n = 7;
cout << findNthNumber(n) << endl;
return 0;
}実行結果
上記のコードを実行すると、次の出力が得られます。
10
n = 7 の場合、数列の7番目の数は 10 となるため、正しく求められていることがわかります(0 が1番目、1 が2番目、…、5 が6番目、10 が7番目)。なお、先頭の 0 を使った「0 × 10」の組み合わせは数として意味を持たないため、コードでは除外しています。
-
C++でN番目のトリボナッチ数を計算する方法
ある値 n が与えられたとき、n番目のトリボナッチ数(Tribonacci number)を求めることを考えます。トリボナッチ数はフィボナッチ数とよく似た数列ですが、フィボナッチ数が直前の2項の和で次の項を作るのに対し、トリボナッチ数では直前の3項の和を使って新しい項を生成します。T(n) を求める漸化式は以下のようになります。T(n) = T(n - 1) + T(n - 2) + T(n - 3)数列の最初の3項は {0, 1, 1} から始まります。アルゴリズムこの問題は、次のようなシンプルな反復処理で解くことができます。初期値として first := 0、second := 1、thi
-
C++で桁の合計がnとなる最小のラッキーナンバー(4と7のみで構成)を求める方法
問題の概要ラッキーナンバーとは、10進表記がラッキーな数字である「4」と「7」のみで構成される正の整数のことです。この問題では、各桁の数字の合計がnと等しくなるような、最小のラッキーナンバーを求めます。例sum = 22 の場合、4 + 4 + 7 + 7 = 22 が成立するため、答えは 4477 となります。アルゴリズムsumが4の倍数であれば、答えはすべて「4」で構成されます。sumが7の倍数であれば、答えはすべて「7」で構成されます。sumが4の倍数でも7の倍数でもない場合は、どちらかの数字を引き続け、sumがもう片方の倍数になるまで減算を行います。実装例(C++)#include &