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

数列 3, 12, 29, 54, 87, … のN番目の項を求めるC++プログラム

問題概要

この問題では、整数 N が与えられます。私たちのタスクは、以下の数列の N番目の項 を求めるC++プログラムを作成することです。

3, 12, 29, 54, 87, 128, …(第N項まで)

入出力例

まず、具体的な例を使って問題を確認しましょう。

入力: N = 5

出力: 87

数列の5番目の項は 87 であるため、これが正しい出力となります。

解法アプローチ:一般項の導出

この種の問題を効率的に解くには、数列の一般項(第n項を表す公式)を導き出すのが有効です。まず、隣り合う項の差に注目してみましょう。

  • 12 − 3 = 9
  • 29 − 12 = 17
  • 54 − 29 = 25
  • 87 − 54 = 33

階差は 9, 17, 25, 33 となっており、それぞれの差が一定(+8)です。つまり二次的な増加パターンを持つ数列であるため、一般項は n の二次式になります。係数を整理すると、この数列の一般項は次の式で表されます。

Tn = 4n² − 3n + 2

この公式を使えば、ループで順番に計算することなく、任意の項の値をO(1)で直接求められます。

検算例:

T8 = 4 × (8²) − 3 × 8 + 2
T8 = 4 × 64 − 24 + 2
T8 = 256 − 22 = 234

C++での実装例

上記の一般項の公式をそのままコードに反映すると、以下のようなシンプルな実装になります。

#include <iostream>
using namespace std;

int findNTerm(int N) {
    int nthTerm = ((4 * N * N) - (3 * N) + 2);
    return nthTerm;
}

int main() {
    int N = 7;
    cout << N << "番目の項は " << findNTerm(N);
    return 0;
}

実行結果

7番目の項は 177

実際に確認すると、4 × 49 − 21 + 2 = 177 となり、正しく計算できていることがわかります。

計算量について

  • 時間計算量: O(1) — 一般項の公式に代入するだけのため、Nの大きさに依存しません。
  • 空間計算量: O(1) — 追加のメモリは不要です。

このように、数列のパターンから一般項を見つけ出すことで、非常に効率的なプログラムを実現できます。

  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」のみで構成されている。 各項の末尾の

  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