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:i を 1 から n までループする
- ステップ1.1:i が奇数なら(i % 2 != 0)→ sum += i2
- ステップ1.2:i が偶数なら(i % 2 == 0)→ sum -= i2
- ステップ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) で計算できる公式を使う方法がおすすめです。
-
C++で二分木における最大部分木の合計を求める方法
この問題では、二分木(バイナリツリー)が与えられます。私たちのタスクは、木の中で最も大きな合計値を持つ部分木を見つけることです。 問題の概要 二分木には正の値と負の値が混在しています。その中から、ノードの合計が最大になる部分木を特定する必要があります。 例で問題を理解しよう 出力: 13 説明: 左部分木の合計:7 右部分木の合計:1 木全体の合計:13 このように、根を含む木全体の合計である「13」が最大の部分木の合計となります。 解法のアプローチ この問題を解くためには、後順走査(ポストオーダー走査)を利用します。手順は以下の通りです。 左部分木と右部分木それぞれのノードの合計を再
-
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