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

C++で指定された数列のN番目の項を求めるプログラム

この問題では、数値 N が与えられ、指定された数列のN番目の項を求めるプログラムをC++で作成します。

問題の説明

次の数列のN番目の項を求めます。

1, 1, 2, 3, 4, 9, 8, 27, 16, 81, 32, 243, 64, 729, 128, 2187, 256, ... (N項まで)

まずは、この数列の一般項(規則性)を見つけるところから始めます。

具体例で問題を確認してみましょう。

例1

入力: N = 6

出力: 9

例2

入力: N = 13

出力: 64

解法のアプローチ

この問題を解くには、まず数列を注意深く観察する必要があります。この数列は複数の規則が混ざった「混合数列」と呼ばれるタイプで、一見するとパターンが分かりにくいですが、一度規則性に気付いてしまえば簡単に扱えるようになります。

この数列は、次のような構造を持っています。

  • 偶数番目の項 … 3の累乗(3⁰, 3¹, 3², 3³, ...)が並んでいます。
  • 奇数番目の項 … 2の累乗(2⁰, 2¹, 2², 2³, ...)が並んでいます。

したがって、一般項は次のように表すことができます。

TN = 2N/2(Nが奇数の場合)

TN = 3(N−1)/2(Nが偶数の場合)

※指数の計算には整数除算を使用します。

C++での実装例

#include <iostream>
#include <cmath>
using namespace std;

// 数列のN番目の項を求める関数
int findNTerm(int N) {
    // Nが偶数の場合:3の累乗
    if (N % 2 == 0) {
        return pow(3, (N - 1) / 2);
    }
    // Nが奇数の場合:2の累乗
    else {
        return pow(2, N / 2);
    }
}

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

出力結果

9番目の項は 16
14番目の項は 729

コードの解説

findNTerm 関数では、N を2で割った余りを判定し、N の偶奇によって処理を分岐させています。

  • N が偶数の場合:3 を (N−1)/2 乗した値を返します。
  • N が奇数の場合:2 を N/2 乗した値を返します。

べき乗計算が1回だけで済むため、時間計算量は O(log N)、空間計算量は O(1) と非常に効率的です。なお、N が大きくなると結果が急激に増大するため、実際の利用では整数型のオーバーフローに注意してください。

  1. 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がどち

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