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

級数 1, 2, 2, 4, 4, 4, 4, 8, 8, 8… のN番目の項を求めるC++プログラム

この問題では、整数 N が与えられ、級数「1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8…」の N 番目の項を求めるプログラムを作成します。

この級数は「1」が1回、「2」が2回、「4」が4回、「8」が8回というように、各値がその値と同じ回数だけ繰り返されるのが特徴です。つまり、2のべき乗の値が出現回数ぶんだけ連続して並ぶ、規則的な構造を持っています。

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

入力

N = 7

出力

4

N = 7 の場合、級数は「1, 2, 2, 4, 4, 4, 4」と並ぶため、7番目の項は「4」になります。

解法1:ループを使った単純なアプローチ

最も基本的な解法は、ループを使って N 番目までの項を順にたどる方法です。各反復処理で現在の項の値だけカウンターを進め、その後項の値を2倍にしていきます。カウンターが N 以上になった時点で、直前の項の値が答えとなります。

  • カウンターと項の値を、それぞれ 0 と 1 で初期化する
  • カウンターが N 以上になるまで、「カウンターに現在の項の値を加算し、項の値を2倍にする」処理を繰り返す
  • ループ終了後、項の値を2で割ったものを返す

実装例

#include <iostream>
using namespace std;

int calcNthTerm(int N) {
    int termCounter = 0, termValue = 1;
    while (termCounter < N) {
        termCounter += termValue;
        termValue *= 2;
    }
    return termValue / 2;
}

int main() {
    int N = 10;
    cout << N << "番目の項の値は " << calcNthTerm(N);
    return 0;
}

出力

10 番目の項の値は 8

解法2:一般項を利用した効率的なアプローチ

級数の規則性を数学的に分析すると、より効率的に N 番目の項を求めることができます。まず、各項とそれが最後に現れる位置(インデックス)の関係を見てみましょう。

1 -> 最後のインデックス = 1
2 -> 最後のインデックス = 3
4 -> 最後のインデックス = 7
8 -> 最後のインデックス = 15
...
T(N) -> 最後のインデックス = 2 * T(N) - 1

この結果から、級数の各項 T(N) は必ず2のべき乗、すなわち T(N) = 2m の形をしており、値 2m はインデックス 2m+1 − 1 まで続きことが分かります。

したがって、N 番目の項を求めるには、次の不等式を満たす m を計算すればよいことになります。

2m − 1 < N
これより、m < log2(N + 1)

つまり m = ⌊log₂(N + 1)⌋ となり、答えは 2m として即座に求められます。この方法は O(1) の時間計算量で動作するため、N が非常に大きい場合でも高速に処理できます。

実装例

#include <iostream>
#include <math.h>
using namespace std;

int calcNthTerm(int N) {
    return pow(2, floor(log(N + 1) / log(2)));
}

int main() {
    int N = 10;
    cout << N << "番目の項の値は " << calcNthTerm(N);
    return 0;
}

出力

10 番目の項の値は 8

まとめ

本記事では、級数「1, 2, 2, 4, 4, 4, 4, 8, …」の N 番目の項を求める2つの方法を紹介しました。1つはループによる O(N) の単純な方法、もう1つは対数を活用した O(1) の効率的な方法です。級数の一般項を見抜いて数学的に解くアプローチのほうが、大きな N に対しても高速に動作するため、実践的には有利といえます。

  1. C++で数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラム

    この記事では、数値Nが与えられたときに、C++を使って数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラムの作成方法を解説します。 問題の説明 次の数列のN番目の項を求めるのが課題です。 3, 5, 21, 51, 95, 153, …(N項まで) この数列は各項の増加パターンから、二次方程式(二次関数)に従うことがわかります。したがって、まず数列の一般項の公式を導き出す必要があります。 入出力例 入力: N = 6 出力: 153 解決アプローチ この問題を解くには、数列の一般項(第n項)の公式を求めます。この数列の一般項は、以下の二次式で表されます。 Tn = 7

  2. 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 解法のアプローチ この問題を解くには、まず数列を注意深く観察する必要があります。この数列は複数の規則が混ざった「