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

C++で級数 2+(2+4)+(2+4+6)+…+(2+4+6+…+2n) の総和を求める方法

この記事では、級数 2 + (2+4) + (2+4+6) + (2+4+6+8) + ... + (2+4+6+8+...+2n) の第 n 項を表す数値 n が与えられたとき、その級数の総和を求めるプログラムを C++ で作成する方法を解説します。

問題を理解するための例

入力:

n = 3

出力:20

説明:
sum = (2) + (2+4) + (2+4+6) = 2 + 6 + 12 = 20

解法1:二重ループを使うシンプルな方法

最も基本的な解法は、ネストされたループ(二重ループ)を使用する方法です。内側のループで級数の i 番目の項(2 から 2i までの偶数の和)を計算し、それを順次合計変数に加算していきます。

サンプルコード

#include <iostream>
using namespace std;
int calcSeriesSum(int n) {
    int sum = 0;
    for (int i = 1; i<=n; i++) {
        int even = 2;
        for (int j = 1; j<=i; j++) {
            sum += even;
            even += 2;
        }
    }
    return sum;
}
int main() {
    int n = 5;
    cout<<"Sum of the series 2 + (2+4) + (2+4+6) + ... + (2+4+6+...+"<<(2*n)<<") is "<<calcSeriesSum(n);
    return 0;
}

出力

Sum of the series 2 + (2+4) + (2+4+6) + ... + (2+4+6+...+10) is 70

しかしこの方法は、時間計算量が O(n2) のオーダーになるため、必ずしも効率的とは言えません。n が大きくなるほど計算時間が急激に増加します。

解法2:数学の公式を使う効率的な方法

より効率的なのは、級数の総和を数学的に導出し、公式として利用するアプローチです。

対象となる級数は次の通りです。

2 + (2+4) + (2+4+6) + (2+4+6+8) + ... + (2+4+6+8+...+2n)

まず、級数の第 n 項は次のように表せます。

an = (2 + 4 + 6 + 8 + … + 2n) = n2 + n

つまり an は「n までの偶数の総和」を意味します。

したがって、級数全体の総和は以下のように変形できます。

sum = 2 + (2+4) + (2+4+6) + (2+4+6+8) + ... + (2+4+6+8+...+2n)
sum = Σ (n² + n)
sum = Σn² + Σn
sum = [ (n*(n+1)*(2n + 1))/6 ] + [ (n*(n+1))/2 ]
sum = ½ (n*(n+1)) [(2n + 1)/3 + 1]
sum = ½ (n*(n+1)) [(2n + 1 + 3)/3]
sum = ½ (n*(n+1)) [2(n+2)/3]
sum = ⅓ n*(n+1)(n+2)

この結果から、級数の総和は n(n+1)(n+2)/3 という単一の公式で求められることが分かります。ループ処理が不要になるため、時間計算量は O(1) に大幅に改善されます。

サンプルコード

#include <iostream>
using namespace std;
int calcSeriesSum(int n) {
    return ((n)*(n+1)*(n+2)/3);
}
int main() {
    int n = 5;
    cout<<"Sum of the series 2 + (2+4) + (2+4+6) + ... + (2+4+6+...+"<<(2*n)<<") is "<<calcSeriesSum(n);
    return 0;
}

出力

Sum of the series 2 + (2+4) + (2+4+6) + ... + (2+4+6+...+10) is 70

まとめ

級数 2 + (2+4) + (2+4+6) + ... + (2+4+6+...+2n) の総和は、数学的に導出することで n(n+1)(n+2)/3 という公式で一発に計算できます。二重ループでは O(n²) かかる計算が、公式を使えば O(1) で完了するため、パフォーマンスを重視する場面では公式ベースの解法を採用するのが望ましいでしょう。

  1. C++で級数 23+45+75+… の最初のN項の合計を求める方法

    このチュートリアルでは、級数 23 + 45 + 75 + … の最初のN項までの合計を求めるC++プログラムについて解説します。具体的には、値Nが与えられたとき、第1項から第N項までのすべての項を順番に足し合わせ、級数全体の合計を求めることが課題となります。級数の合計を求める公式この問題を数学的に解くと、級数の合計は次の公式で表すことができます。Sn = (2n(n+1)(4n+17) + 54n) / 6この公式を使えば、各項を1つずつ足していく反復処理を行わなくても、O(1)の計算量で瞬時に合計を求められます。Nが大きくなっても高速に動作するのが大きなメリットです。実装例#include

  2. C++で等差数列(算術級数)の和を求めるプログラム

    初項「a」、公差「d」、項数「n」が与えられたとき、等差数列を生成し、その合計を計算するのが本プログラムの目的です。 等差数列(算術級数)とは 等差数列とは、隣り合う項の差が常に一定である数列のことです。数列の初項は「a」に固定され、項と項の間の共通の差(公差)は「d」で表されます。 数列は次のように表されます。 a, a + d, a + 2d, a + 3d, … 入力例と出力例 入力: a = 1.5, d = 0.5, n = 10 出力: 等差数列の合計は: 37.5 入力: a = 2.5, d = 1.5, n = 20 出力: 等差数列の合計は: 335 解き方のアプローチ