C++で級数 1/1 + (1+2)/(1×2) + (1+2+3)/(1×2×3) + … のn項までの合計を求める方法
本記事では、整数 n が与えられたとき、次の級数の n 項までの合計を求めるプログラムを C++ で作成します。
級数: 1/1 + (1+2)/(1×2) + (1+2+3)/(1×2×3) + … (n 項まで)
この級数の第 k 項は「1からkまでの総和(sum)」を「1からkまでの総乗(積:prod)」で割った値になっています。
例で問題を理解しよう
入力
n = 3
出力
3.5
説明 −
(1/1) + (1+2)/(1×2) + (1+2+3)/(1×2×3) = 1 + 1.5 + 1 = 3.5
解法のアプローチ
この問題に対するシンプルな解法は、i = 1 から n までループ処理を行うことです。各反復ごとに、i までの総和と総乗を更新し、「総和 ÷ 総乗」の値を結果に加算していきます。
アルゴリズム
result = 0.0、sum = 0、prod = 1 で初期化
Step 1: i = 1 から n まで繰り返し、以下を実行する :
Step 1.1: sum += i 、prod *= i として値を更新する
Step 1.2: result += (double)sum / prod として結果を更新する
Step 2: result を出力する。C++による実装例
上記の解法の動作を示すプログラムは以下の通りです。
#include <iostream>
using namespace std;
double calcSeriesSum(int n) {
double result = 0.0 ;
int sum = 0, prod = 1;
for (int i = 1 ; i <= n ; i++) {
sum += i;
prod *= i;
result += ((double)sum / prod);
}
return result;
}
int main() {
int n = 12;
cout<<"級数 1/1 + (1+2)/(1*2) + (1+2+3)/(1*2*3) + ... の "<<n<<" 項までの合計は " <<calcSeriesSum(n) ;
return 0;
}出力
級数 1/1 + (1+2)/(1*2) + (1+2+3)/(1*2*3) + ... の 12 項までの合計は 4.07742
計算量について
この解法では、ループが n 回実行され、各反復内の処理は定数時間で完了するため、時間計算量は O(n) となります。また、使用している変数は result・sum・prod のみであるため、空間計算量は O(1) です。総和と総乗を毎回ゼロから再計算せず、前回の値を再利用することで効率的に計算できる点がポイントです。
-
【C++】級数 1 − x²/2! + x⁴/4! − … の第n項までの和を求めるプログラム
このチュートリアルでは、級数 1 − x²/2! + x⁴/4! − … を第n項まで計算し、その和を求めるC++プログラムについて解説します。この問題では、x と n の値が入力として与えられます。私たちのタスクは、指定された n 項まで級数を計算し、その合計値を求めることです。階乗(factorial)を計算する処理と、標準ライブラリのべき乗関数 pow() を組み合わせれば、簡単に実装できます。サンプルコード#include <math.h> #include <stdio.h> // 級数の和を計算する関数 double calc_sum(double x,
-
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