C++で級数 0.7、0.77、0.777… の最初のn項の総和を求める方法
問題概要
本記事では、級数「0.7、0.77、0.777…」の最初の n 項が与えられたとき、その総和を求めるプログラムを C++ で作成します。
問題を理解するための例
入力:4
出力:3.0247
説明:0.7 + 0.77 + 0.777 + 0.7777 = 3.0247
級数の和の一般公式の導出
各項を順番に加算しても合計は求められますが、級数の構造を利用して一般公式を導出すれば、より効率的に計算できます。以下がその導出過程です。
sum = 0.7 + 0.77 + 0.777 + …(n項まで) sum = 7 × (0.1 + 0.11 + 0.111 + …(n項まで)) sum = 7 × (9/9) × (0.1 + 0.11 + 0.111 + …(n項まで)) sum = (7/9) × (0.9 + 0.99 + 0.999 + …(n項まで)) sum = (7/9) × ((1 − 0.1) + (1 − 0.01) + (1 − 0.001) + …(n項まで)) sum = (7/9) × ((1 + 1 + … のn回の和) − (0.1 + 0.01 + 0.001 + …(n項まで))) sum = (7/9) × (n − (1/10 + 1/100 + 1/1000 + …(n項まで))) sum = (7/9) × (n − 0.1 × ((1 − (0.1)^n) / (1 − 0.1))) sum = (7/9) × (n − 0.1 × ((1 − (0.1)^n) / 0.9)) sum = (7/9) × (n − ((1 − (1/10)^n) / 9)) sum = (7/81) × (9n − (1 − (1/10)^n)) sum = (7/81) × (9n − 1 + 10^(−n))
この式が、n 項までの級数の総和を求めるための一般公式です。なお、7/81 ≒ 0.08641 である点に注意してください。
C++による実装例
上記の公式を用いた解法の動作を示すサンプルプログラムがこちらです。
#include <iostream>
#include <math.h>
using namespace std;
float calcSeriesSum(int n) {
return ( (0.08641) * (9*n - 1) + pow(10, (-1) * n) );
}
int main() {
int n = 5;
cout<<"級数 0.7, 0.77, 0.777, ... の最初の n 項の和は "<<calcSeriesSum(n);
return 0;
}
実行結果
級数 0.7, 0.77, 0.777, ... の最初の n 項の和は 3.80205
n = 5 の場合、0.7 + 0.77 + 0.777 + 0.7777 + 0.77777 の総和は 3.80205 となります。この手法なら、各項をループで順に加算する O(n) のアプローチとは異なり、O(1) の定数時間で答えを求められるため、n が大きくなっても高速に動作するのが大きなメリットです。
-
【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