C++で数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラム
この問題では、数値 N が与えられ、C++を用いて数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラムを作成します。
問題の概要
次の数列のN番目の項を求めます。
1, 2, 11, 12, 21, 22, 111, 112, …(第N項まで)
この数列には一定のパターンが隠されており、それをもとに一般項を導き出す必要があります。
具体例を見てみましょう。
入力
N = 8
出力
112
解法のアプローチ
一般項を導くためには、まず数列を注意深く観察することが重要です。この数列には次のような特徴があります。
- すべての項が「1」と「2」のみで構成されている。
- 各項の末尾の数字が「1」と「2」で交互に現れる。
- 前半の項を10倍して1または2を加えることで、後続の項が生成される。
これらの規則性から、一般項は以下の漸化式で表せます。
- N が奇数の場合:T(N) = T(N/2) × 10 + 1
- N が偶数の場合:T(N) = T((N/2) − 1) × 10 + 2
なお、初期条件は T(1) = 1、T(2) = 2 となります。
実装例
#include <iostream>
using namespace std;
int findNTerm(int N) {
if (N == 1)
return 1;
if (N == 2)
return 2;
int value;
if (N % 2 == 0) {
value = (findNTerm((N / 2) - 1) * 10) + 2;
} else {
value = (findNTerm((N / 2)) * 10) + 1;
}
return value;
}
int main() {
int N = 12;
cout << N << "番目の数列の項は " << findNTerm(N);
return 0;
}
出力
12番目の数列の項は 212
コードの解説
このプログラムでは、再帰関数 findNTerm() を使用して漸化式を実装しています。
例として N = 12 の場合を追ってみましょう。N = 12 は偶数なので、T(12) = T(5) × 10 + 2 となります。次に T(5) は奇数なので、T(5) = T(2) × 10 + 1 = 21 です。したがって、T(12) = 21 × 10 + 2 = 212 が求まります。
各ステップでNが約半分になるため、計算量は非常に効率的です。
- 時間計算量:O(log N)
- 空間計算量:O(log N)(再帰呼び出しのスタック分)
-
C++で数列a、b、b、c、c、cのN番目の項を求めるプログラム
この問題では、数Nが与えられます。私たちのタスクは、C++で数列a、b、b、c、c、c…のN番目の項を求めるプログラムを作成することです。問題の説明次の数列のN番目の項を求めます。a、b、b、c、c、c、d、d、d、d、....(全N項)そのためには、この数列の一般項を見つける必要があります。具体例を使って問題を理解しましょう。入力:N = 7出力:d解法アプローチ数列の一般項を求めるには、まず数列を注意深く観察する必要があります。この数列は「a」が1個、「b」が2個、「c」が3個、「d」が4個…というように、同じ文字が増えていきながら繰り返される構成になっています。これは初項aと公差dがどち
-
C++で数列3、5、33、35、53…のN番目の項を求めるプログラム
はじめにこのチュートリアルでは、数列「3、5、33、35、53…」のN番目の項を求めるC++プログラムについて解説します。この問題では、ある整数nが与えられます。私たちのタスクは、その数列におけるn番目の項を特定することです。数列の規則性まず、この数列がどのように構成されているのかを見てみましょう。1番目の項:32番目の項:53番目の項:33(1番目の項に「3」を付加)4番目の項:35(1番目の項に「5」を付加)5番目の項:53(2番目の項に「3」を付加)6番目の項:55(2番目の項に「5」を付加)つまり、奇数番目の項は「i/2 番目の項の末尾に3を付けた数」、偶数番目の項は「(i/2 − 1