C++で調和級数の総和を求めるプログラムの書き方
この記事では、3つの値 a(初項)、d(公差)、n(項数)が与えられたときに、C++を使って調和級数の総和を求めるプログラムの作成方法を解説します。
調和級数とは?
調和数列(Harmonic Progression:HP)とは、各項の逆数をとると等差数列になる数列のことです。つまり、調和数列 A1, A2, A3…An の各項の逆数 1/A1, 1/A2, 1/A3 が等差数列を構成します。
したがって、一般的な調和数列は次のように表せます。
1/a, 1/(a+d), 1/(a+2d), … 1/(a + nd)
ここで、1/a が初項、d は対応する等差数列の公差です。
問題の概要
本記事の問題では、初項 a、公差 d、項数 n が与えられます。これらの情報をもとに、調和数列全体の総和を計算します。
具体的な入出力例を見てみましょう。
入力例
a = 3, d = 2, n = 5
出力例
0.878211
説明
この場合の調和数列は 1/3, 1/5, 1/7, 1/9, 1/11 となります。
Sum = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 = 0.878211
解決アプローチ
基本的な考え方はシンプルです。第 n 項まで順番にループ処理を行い、調和数列の各項の値を求めて変数 sumVal に加算していきます。最後に sumVal を返すことで総和が得られます。
アルゴリズム
初期化: sumVal = 0, term = 0;
- ステップ1: i を 1 から n までループさせる
ステップ1.1: 各項を計算する → term = 1/(a + (i-1)*d) - ステップ1.2: 総和を更新する → sumVal += term
- ステップ2: sumVal を出力する
C++による実装例(反復処理)
実際のコードで動作を確認してみましょう。
#include <iostream>
using namespace std;
float findSeriesSum(int a, int d, int n){
float sumVal = 0;
float term = 0;
for(float i = 1; i <= n; i++){
term = (1.0)/(float)(a + (i-1)*d);
sumVal += term;
}
return sumVal;
}
int main(){
int n = 5, a = 3, d = 2;
cout<<"The sum of HP is "<<findSeriesSum(a, d, n);
return 0;
}
出力
The sum of HP is 0.878211
再帰関数を使った別のアプローチ
ループ処理の代わりに、再帰関数を利用して総和を求めることも可能です。末項から順に加算していく形で実装します。
#include <iostream>
using namespace std;
float findSeriesSum(int a, int d, int n){
if(n == 1){
return (float)(1.0)/a;
}
float term = (1.0)/ (float)(a + (n-1)*d);
return term + findSeriesSum(a, d, n-1);
}
int main(){
int n = 5, a = 3, d = 2;
cout<<"The sum of HP is "<<findSeriesSum(a, d, n);
return 0;
}
出力
The sum of HP is 0.878211
計算量について
どちらの方法でも、項数 n に対して時間計算量は O(n) で計算できます。ただし空間計算量については、反復版は補助変数のみで済むため O(1) である一方、再帰版は関数呼び出しスタックを使用するため O(n) のメモリが必要になる点に注意しましょう。大きな n を扱う場合は反復処理の方が効率的です。
-
C++で数列a、b、b、c、c、cのN番目の項を求めるプログラム
この問題では、数Nが与えられます。私たちのタスクは、C++で数列a、b、b、c、c、c…のN番目の項を求めるプログラムを作成することです。問題の説明次の数列のN番目の項を求めます。a、b、b、c、c、c、d、d、d、d、....(全N項)そのためには、この数列の一般項を見つける必要があります。具体例を使って問題を理解しましょう。入力:N = 7出力:d解法アプローチ数列の一般項を求めるには、まず数列を注意深く観察する必要があります。この数列は「a」が1個、「b」が2個、「c」が3個、「d」が4個…というように、同じ文字が増えていきながら繰り返される構成になっています。これは初項aと公差dがどち
-
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」のみで構成されている。 各項の末尾の