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

C++で級数 1 + (1+3) + (1+3+5) + … + (1+3+5+…+(2n−1)) の合計を求める方法

問題概要

この問題では、整数 n が与えられ、以下の級数の合計を求めるプログラムを作成します。

1 + (1+3) + (1+3+5) + (1+3+5+7) + … + (1+3+5+7+…+(2n−1))

この級数をよく観察すると、i 番目の項は「最初の i 個の奇数の和」になっていることがわかります。

例題で理解を深めよう

入力:

n = 3

出力:

14

説明: (1) + (1+3) + (1+3+5) = 14

解法1:二重ループを使うシンプルなアプローチ

最も直感的な解決策は、二重ループ(ネストされたループ)を使い、各項の奇数を順番に合計変数へ加算していき、最後に合計を返す方法です。

サンプルコード

#include <iostream>
using namespace std;
int calcSeriesSum(int n) {
    int sum = 0, element = 1;
    for (int i = 1; i <= n; i++) {
        element = 1;
        for (int j = 1; j <= i; j++) {
            sum += element;
            element += 2;
        }
    }
    return sum;
}
int main() {
    int n = 12;
    cout<<"Sum of the series 1 + (1+3) + (1+3+5) + (1+3+5+7) + ... + (1+3+5+7+ ... + (2"<<n<<"-1)) is "<<calcSeriesSum(n);
    return 0;
}

実行結果

Sum of the series 1 + (1+3) + (1+3+5) + (1+3+5+7) + ... + (1+3+5+7+ ... + (2*12-1)) is 650

この方法は正しく動作しますが、二重ループを使用するため計算量が O(n²) となり、n が大きくなるほど非効率になります。

解法2:数学的公式を使う効率的なアプローチ

より効率的な方法は、級数の合計を求める一般公式を数学的に導出することです。

まず、最初の n 個の奇数の和(=級数の各項に相当)について考えます。

1 + 3 + 5 + … + (2n−1) = n²

この性質を利用すると、級数全体の合計は次のように変形できます。

sum = (1) + (1+3) + (1+3+5) + … + (1+3+5+…+(2n−1))
sum = Σ (1+3+5+…+(2i−1)) (i = 1 ~ n)
sum = Σ i²
sum = n(n+1)(2n+1)/6

つまり、この級数は「最初の n 個の平方数の和」と等しく、有名な公式 n(n+1)(2n+1)/6 を使えば一度の計算で答えが求まります。

サンプルコード

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

実行結果

Sum of the series 1 + (1+3) + (1+3+5) + (1+3+5+7) + ... + (1+3+5+7+ ... + (2*9-1)) is 285

まとめ

二重ループを使う方法は計算量 O(n²)、公式を使う方法は O(1) で計算できます。大きな n を扱う場合は、級数の数学的な性質を活かした公式ベースのアプローチが圧倒的に効率的です。

  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 解き方のアプローチ