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

C++で級数 1² − 2² + 3² − 4² … の第n項までの合計を求める方法

この問題では、整数値 N が与えられ、「1² − 2² + 3² − 4² …」という符号が交互に入れ替わる平方数の級数について、第 n 項までの合計を求めることが課題となります。

問題の確認

まず、具体例を見てみましょう。

入力:N = 3
出力:6

説明:
12 − 22 + 32 = 1 − 4 + 9 = 6

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

最も直感的な解き方は、ループ処理を使う方法です。反復変数 i を 1 から n まで回しながら、次のように処理します。

  • i が奇数の場合 → 合計(sum)に i2加算する
  • i が偶数の場合 → 合計(sum)から i2減算する

ループ終了後の sum の値が、求める級数の合計になります。

アルゴリズム

初期化:sum = 0

  1. ステップ1:i を 1 から n までループする
    • ステップ1.1:i が奇数なら(i % 2 != 0)→ sum += i2
    • ステップ1.2:i が偶数なら(i % 2 == 0)→ sum -= i2
  2. ステップ2:sum を返す

C++ 実装例

上記の解法を実装したプログラムがこちらです。

#include <iostream>
using namespace std;

int findSumOfSeries(int n) {
   int sum = 0;
   for (int i = 1; i <= n; i++) {
      if (i % 2 == 0)
         sum -= (i * i);
      else
         sum += (i * i);
   }
   return sum;
}

int main(void) {
   int n = 5;
   cout << "級数の合計は " << findSumOfSeries(n);
   return 0;
}

実行結果

級数の合計は 15

この方法の計算量は O(n) です。n が大きくなるほど処理時間が増えるため、次に紹介する数式を使った方法が有効です。

解法2:数式を使った効率的な方法

級数の性質を利用して式を変形すると、ループなしで O(1) で答えを求められます。n の偶奇によって導かれる式が異なります。

n が偶数の場合

sum = 12 − 22 + 32 − 42 + … + (n−1)2 − n2

隣り合う2項ずつペアにして因数分解すると、

sum = (1−2)(1+2) + (3−4)(3+4) + … + {(n−1)−n}・{(n−1)+n}

sum = (−1)×3 + (−1)×7 + … + (−1)×(2n−1)

sum = (−1) × (1 + 2 + 3 + … + n)

sum = − n(n+1)/2

n が奇数の場合

sum = 12 − 22 + … + (n−2)2 − (n−1)2 + n2

最後の n2 を除いた部分は項数が n−1(偶数個)なので、偶数の場合と同じ要領で変形できます。

sum = { − (n−1)・n / 2 } + n2

sum = (−n2 + n + 2n2) / 2

sum = (n2 + n) / 2 = n(n+1)/2

つまり、n が偶数なら「−n(n+1)/2」、n が奇数なら「n(n+1)/2」というシンプルな公式で答えが求まります。

C++ 実装例

#include <iostream>
using namespace std;

int findSumOfSeries(int n) {
   int sum = 0;
   if (n % 2 == 0) {
      sum = (-1) * (n * (n + 1)) / 2;
   } else {
      sum = (n * (n + 1)) / 2;
   }
   return sum;
}

int main(void) {
   int n = 5;
   cout << "級数の合計は " << findSumOfSeries(n);
   return 0;
}

実行結果

級数の合計は 15

まとめ

級数「1² − 2² + 3² − 4² …」の第 n 項までの合計は、ループで順番に加減算する方法と、n の偶奇に応じた公式を使う方法の2通りで求められます。計算効率を重視する場合は、O(1) で計算できる公式を使う方法がおすすめです。

  1. C++で二分木における最大部分木の合計を求める方法

    この問題では、二分木(バイナリツリー)が与えられます。私たちのタスクは、木の中で最も大きな合計値を持つ部分木を見つけることです。 問題の概要 二分木には正の値と負の値が混在しています。その中から、ノードの合計が最大になる部分木を特定する必要があります。 例で問題を理解しよう 出力: 13 説明: 左部分木の合計:7 右部分木の合計:1 木全体の合計:13 このように、根を含む木全体の合計である「13」が最大の部分木の合計となります。 解法のアプローチ この問題を解くためには、後順走査(ポストオーダー走査)を利用します。手順は以下の通りです。 左部分木と右部分木それぞれのノードの合計を再

  2. 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