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

C++で級数 a^1/1! + a^2/2! + a^3/3! + … + a^n/n! の総和を求めるプログラム

この記事では、2つの数値 an が与えられたとき、級数 a1/1! + a2/2! + a3/3! + a4/4! + ……… + an/n! の総和を求めるC++プログラムの作成方法を解説します。

問題の概要

与えられた a と n の値をもとに、上記の級数の総和を計算することが課題です。この級数は特殊な構造を持っており、各項は「直前の項に a/i を掛けた値」になっています(i は 1 から n まで)。この性質を利用すると、階乗や累乗を毎回計算する必要がなくなり、効率的な実装が可能です。

入出力例で理解する

入力

a = 3, n = 4

出力

15.375

説明

級数の総和は以下のように計算されます。

(3^1)/1! + (3^2)/2! + (3^3)/3! + (3^4)/4!
= 3 + 9/2 + 27/6 + 81/24
= 15.375

解法のアプローチ

級数の総和を求めるには、ループ処理で i 番目の項を順に計算し、その都度合計に加算していくのが基本です。

しかし、各項の累乗や階乗をそのまま計算すると、不要な計算オーバーヘッドが発生します。そこで、次の関係式を活用します。

i 番目の項 = (i−1) 番目の項 × a / i

この漸化式を使えば、前の項から次の項を簡単に導き出せるため、計算量を大幅に削減でき、コード全体のパフォーマンスが向上します。

解法の実装例

以下は、この考え方を実装したC++プログラムです。

#include <iostream>
using namespace std;

float calcSeriesSum(int a, int n){
    float sumVal = 0, term = 1;
    for(float i = 1; i <= n; i++){
        term *= a/i;   // 前の項から次の項を計算
        sumVal += term;
    }
    return sumVal;
}

int main(){
    int a = 3, n = 4;
    cout<<"The sum of the series is "<<calcSeriesSum(a, n);
    return 0;
}

出力

The sum of the series is 15.375

計算量について

  • 時間計算量: O(n) — ループを n 回回すだけなので非常に高速です。
  • 空間計算量: O(1) — 合計値と現在の項を保持する変数のみを使用します。

補足:級数の数学的な意味

この級数は、指数関数のテイラー展開と密接な関係があります。実際、n → ∞ の極限で総和は ea − 1 に収束します。たとえば a = 3 の場合、理論値は約 19.0855 となり、n を大きくするほど計算結果がこの値に近づいていくことが確認できます。

  1. Pythonでオイラー数eを計算する方法|e = 1 + 1/1! + 1/2! + … + 1/n! を使った実装

    オイラー数(ネイピア数)eは、数学において最も重要な定数の一つです。本記事では、次の級数の式を用いてオイラー数の値を計算するPythonプログラムの実装方法を解説します。 e = 1 + 1/1! + 1/2! + 1/3! + …… + 1/n! この計算を実現するためには、まず与えられた数の階乗を求める関数を定義し、続いてそれらの階乗の逆数の総和を計算する関数を定義します。以下に具体的な実装例を示します。 サンプルコード def factorial_result(n): result = 1 for i in range(2, n + 1): result

  2. 1/1! + 2/2! + 3/3! + …… + n/n! の級数の合計を求めるPythonプログラム

    この記事では、与えられた問題を解くための解法とアプローチについて詳しく解説します。 問題文 整数 n が入力として与えられたとき、次の級数の合計を求めます。 1/1! + 2/2! + 3/3! + 4/4! + …… + n/n! ここでは for ループを使用して実装するため、時間計算量は O(n) となります。また、処理効率を高めるポイントとして、階乗の計算を同じループ内で同時に行っている点が挙げられます。 アルゴリズム 以下の手順で級数の合計を求めます。 合計値 res を 0、階乗値 fact を 1 で初期化します。 i を 1 から n まで順に処理し、fact *= i に