C++で数列 0, 9, 22, 39, 60, 85, 114, 147,… の第N項を求めるプログラム
問題概要
この記事では、数値 N が与えられたときに、次の数列の第 N 項を求める C++ プログラムの作成方法を解説します。
0, 9, 22, 39, 60, 85, 114, 147, …(全 N 項)
入出力の例
- 入力: N = 6
- 出力: 85
この例では、数列の 6 番目の項が 85 であるため、出力は 85 になります。プログラムの目的は、任意の N に対して対応する項の値を正しく返すことです。
解法のアプローチ:一般項を導出する
数列の第 N 項を求めるには、まず数列の一般項(N を使った式)を導出します。そのために、各項の値がどのように増加しているのかを観察してみましょう。
| 項番号 N | 値 | 前項との差(階差) |
|---|---|---|
| 1 | 0 | ― |
| 2 | 9 | +9 |
| 3 | 22 | +13 |
| 4 | 39 | +17 |
| 5 | 60 | +21 |
| 6 | 85 | +25 |
階差を見ると、9 → 13 → 17 → 21 → 25 と、毎回一定量(+4)ずつ増えていることが分かります。「階差が等差数列になる」とき、元の数列は放物線状に成長する二次数列であり、一般項は二次式で表せることが知られています。
さらに計算を進めると、この数列の一般項は次の公式で表されます。
TN = 2 × N2 + 3 × N − 5
公式の検証
- N = 1 のとき:2×1 + 3×1 − 5 = 0 ✔
- N = 2 のとき:2×4 + 3×2 − 5 = 9 ✔
- N = 6 のとき:2×36 + 3×6 − 5 = 85 ✔
実際の数列と一致していることが確認できます。
C++ プログラムの実装
#include <iostream>
using namespace std;
int findNTerm(int N) {
int nthTerm = ((2 * N * N) + (3 * N) - 5);
return nthTerm;
}
int main()
{
int N = 8;
cout<<N<<"th term of the series is "<<findNTerm(N);
return 0;
}
実行結果
8th term of the series is 147
コードの解説
findNTerm 関数: 引数として受け取った N に対して、一般項の公式 TN = 2N2 + 3N − 5 を計算し、その値を返します。
main 関数: 変数 N に 8 を設定し、findNTerm を呼び出して第 8 項の値を出力します。
まとめ
数列のパターンを観察して一般項を導出できれば、ループで項を順番に計算する必要はなく、任意の第 N 項を O(1) の計算量で瞬時に求められます。規則性のある数列の問題を効率的に解くうえで、非常に有効なアプローチです。
-
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」のみで構成されている。 各項の末尾の
-
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