C++で数値の調和平均を計算するプログラム
自然数の配列が与えられ、その数値群の調和平均を計算して出力することが本記事の課題です。
調和平均とは?
調和平均とは、各要素の逆数を平均し、さらにその逆数を取った値として定義される平均の一種です。速度や比率など、「単位あたりの量」の平均を求めたい場合に特に有効です。
$$Harmonic\: Mean=\frac{n}{\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+...}$$
ここで、n は与えられた要素の総数、a, b, c, … は配列内の実際の要素を表します。
調和平均を計算する手順は以下の通りです −
各要素の逆数を求める
すべての逆数を合計する
配列の要素数を、逆数の合計値で割る
入力
arr[] = {2.0, 3.4, 5.3, 2.1}
出力
Harmonic mean is: 2.74163
入力
arr[] = {13.5, 14.5, 14.8, 15.2, 16.1}
出力
Harmonic mean is : 14.7707
アルゴリズム
Start
Step 1→ 数値の調和平均を計算する関数を宣言する
float harmonic_mean(float arr[], int size)
float sum = 0 を宣言する
ループ For int i = 0 and i < size and i++
sum = sum + (float)1 / arr[i] を設定する
End
return (float)size/sum
Step 2→ main() 内で
float arr[] = {2.0, 3.4, 5.3, 2.1} を宣言する
int size = sizeof(arr) / sizeof(arr[0]) を宣言する
harmonic_mean(arr, size) を呼び出す
Stop
サンプルコード
#include <bits/stdc++.h>
using namespace std;
//calculate harmonic mean
float harmonic_mean(float arr[], int size){
float sum = 0;
for (int i = 0; i < size; i++)
sum = sum + (float)1 / arr[i];
return (float)size/sum;
}
int main(){
float arr[] = {2.0, 3.4, 5.3, 2.1};
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"Harmonic mean is : "<<harmonic_mean(arr, size);
return 0;
}
実行結果
上記のコードを実行すると、以下のような出力が得られます −
Harmonic mean is : 2.74163
コードのポイント
このプログラムでは、逆数を計算する際に (float)1 / arr[i] とキャストすることで、整数同士の除算による切り捨て誤差を防いでいます。また、sizeof(arr) / sizeof(arr[0]) を使うことで、配列の要素数を自動的に取得でき、配列のサイズが変わってもコードを修正する必要がありません。なお、実際の開発では配列の代わりに std::vector<double> を使用すると、より柔軟で安全な実装が可能です。
-
二分法を用いて方程式の根を求めるC++プログラム
関数f(x)と2つの数a、bが与えられ、f(a)・f(b)<0を満たし、関数f(x)が区間[a, b]内に存在するとします。ここでの課題は、二分法(バイセクション法)を用いて、関数f(x)の区間aとbの間に存在する根の値を求めることです。 二分法とは? 二分法とは、「a」と「b」で定義された範囲内において、関数f(x)の根の値を求めるための数値計算手法の一つです。関数の根とは、その値を代入したときにf(x)=0となるような値xのことです。 例 方程式 F(x) = x^3 − 8 を考える この方程式は、x = 2 のとき F(x) = 2^3 − 8 = 0 となります。 したがって
-
最初のn個の自然数の二乗和を求めるC++プログラムの解説
はじめにこの記事では、最初のn個の自然数(1からnまで)の二乗和を求める方法について解説します。例えば、n = 4 の場合、計算結果は 1² + 2² + 3² + 4² = 1 + 4 + 9 + 16 = 30 となります。基本的なアプローチとしては、1からnまで繰り返すforループを使用し、各ステップで項の二乗を計算して合計に加算していく方法があります。このプログラムの計算量は O(n) です。しかし、O(1) の定数時間で解きたい場合は、次の級数の公式を利用できます。Σk² = n(n + 1)(2n + 1) / 6この公式を使えば、ループ処理を行わずに一発で答えを求めることが可能で