C++で級数「1×2×3 + 2×3×4 + 3×4×5 + … + n×(n+1)×(n+2)」の総和を求めるプログラム
問題の概要
本記事では、級数の第n項を指定する整数nが与えられたとき、C++で次の級数の総和を求めるプログラムを作成します。
1×2×3 + 2×3×4 + 3×4×5 + … + n×(n+1)×(n+2)
問題の説明:与えられた級数について、第n項までの和を求めます。これは「i×(i+1)×(i+2)」という形の項を、i = 1 から n まで順番に足し合わせることに相当します。
入出力例で問題を理解しよう
入力:
n = 5
出力:
420
説明:
1×2×3 + 2×3×4 + 3×4×5 + 4×5×6 + 5×6×7
= 6 + 24 + 60 + 120 + 210 = 420
解法1:ループで順番に足し合わせる方法
もっとも単純な解法は、1からnまでループを回し、各反復でその項の積を計算して合計用の変数(sumVar)に加えていく方法です。ループが終了した時点でsumVarを返します。
アルゴリズム
- ステップ1:i を 1 から n までループさせる。
- ステップ1.1:sumVar を更新する → sumVar += i×(i+1)×(i+2)
- ステップ2:sumVar の値を出力する。
実装例
#include <iostream>
using namespace std;
// 第n項までの級数の和を計算する関数
int calcSeriesSum(int n){
int sumVar = 0;
// 各項 i*(i+1)*(i+2) を順に加算
for(int i = 1; i <= n; i++)
sumVar = sumVar + ( (i)*(i+1)*(i+2) );
return sumVar;
}
int main(){
int n = 7;
cout<<"The sum of series till "<<n<<" is "<<calcSeriesSum(n);
return 0;
}
出力:
The sum of series till 7 is 1260
この方法は直感的で分かりやすい反面、計算時間が項数Nに比例して増えるため、nが大きくなると非効率になります(時間計算量 O(N))。
解法2:数学の公式を使う高効率な方法
もう一つのアプローチは、級数の和を数学的に導出した公式を利用することです。この級数は、次のように総和記号で表すことができます。
Sum = Σ[i=1→n] i×(i+1)×(i+2)
これを展開して整理していきます。
Sum = Σ { (i² + i)(i + 2) }
= Σ { i³ + i² + 2i² + 2i }
= Σ { i³ + 3i² + 2i }
= Σ i³ + 3・Σ i² + 2・Σ i
ここで、よく知られたべき乗の和の公式を使用します。
Σ i = n(n+1)/2
Σ i² = n(n+1)(2n+1)/6
Σ i³ = {n(n+1)}² / 4
これらを代入して因数分解すると、
Sum = {n(n+1)}²/4 + 3・n(n+1)(2n+1)/6 + 2・n(n+1)/2
= {n(n+1)}²/4 + n(n+1)(2n+1)/2 + n(n+1)
= {n(n+1)/4} × { n(n+1) + 2(2n+1) + 4 }
= {n(n+1)/4} × (n² + 5n + 6)
= {n(n+1)/4} × (n+2)(n+3)
したがって、第n項までの級数の和は次の公式で一発に求められます。
Sum = n × (n+1) × (n+2) × (n+3) / 4
この公式を使えばループが不要になり、定数時間(O(1))で答えが得られるため、非常に効率的です。
実装例
#include <iostream>
using namespace std;
// 公式 n*(n+1)*(n+2)*(n+3)/4 を使って和を計算する関数
int calcSeriesSum(int n){
int sumVar = 0;
sumVar = ( (n)*(n + 1)*(n + 2)*(n + 3)/4 );
return sumVar;
}
int main(){
int n = 7;
cout<<"The sum of series till "<<n<<" is "<<calcSeriesSum(n);
return 0;
}
出力:
The sum of series till 7 is 1260
n = 7 の場合、「7×8×9×10 ÷ 4 = 1260」となり、ループ版と同じ結果が得られることが確認できます。
まとめ
級数「1×2×3 + 2×3×4 + … + n×(n+1)×(n+2)」の総和を求めるには、大きく分けて2つの方法があります。
- ループによる解法:各項を順に加算する素直な方法。時間計算量は O(N)。
- 公式による解法:「n×(n+1)×(n+2)×(n+3) ÷ 4」を直接計算する方法。時間計算量は O(1)。
パフォーマンスが重要な場面では、数学的公式を導出して定数時間で解くアプローチが有効です。ぜひ両方の実装を試して、違いを実感してみてください。
-
C++で数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラム
この問題では、数値 N が与えられ、C++を用いて数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラムを作成します。 問題の概要 次の数列のN番目の項を求めます。 1, 2, 11, 12, 21, 22, 111, 112, …(第N項まで) この数列には一定のパターンが隠されており、それをもとに一般項を導き出す必要があります。 具体例を見てみましょう。 入力 N = 8 出力 112 解法のアプローチ 一般項を導くためには、まず数列を注意深く観察することが重要です。この数列には次のような特徴があります。 すべての項が「1」と「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 解き方のアプローチ