C++で自然数の加重平均を求めるプログラムの実装方法
自然数の配列と、各自然数に対応する重みを格納したもう1つの配列が与えられたとき、これらの自然数の加重平均(重み付き平均)を求めることを考えます。
加重平均の計算式
加重平均は、次の式を使って計算できます。
$$\overline{x}=\frac{\displaystyle\sum\limits_{i=1}^n (x_{i}\cdot w_{i})}{\displaystyle\sum\limits_{i=1}^n w_{i}}$$
ここで、x は自然数、w はその自然数に対応する重みを表します。つまり、「各値と重みの積の総和」を「重みの総和」で割ることで求められます。
入出力例
例1
入力
X[] = {11, 22, 43, 34, 25, 16}
W[] = {12, 12, 43, 54, 75, 16}出力
weighted mean is : 29.3019
計算過程
(11×12 + 22×12 + 43×43 + 34×54 + 25×75 + 16×16) ÷ (12 + 12 + 43 + 54 + 75 + 16)
例2
入力
X[] = {3, 4, 5, 6, 7}
W[] = {4, 5, 6, 7, 8}出力
weighted mean is : 5.33333
計算過程
(3×4 + 4×5 + 5×6 + 6×7 + 7×8) ÷ (4 + 5 + 6 + 7 + 8)
プログラムのアプローチ
- 2種類の配列を入力として受け取ります。1つは自然数の配列、もう1つは対応する重みの配列です。
- 加重平均の公式を適用して値を計算します。
- 計算結果を出力します。
なお、両方の配列の要素数が一致していない場合は加重平均が計算できないため、-1 を出力するようにします。
アルゴリズム
開始
Step1 → 自然数の加重平均を計算する関数を宣言する
float weightedmean(int X[], int W[], int size)
int sum = 0, weight = 0 を宣言
ループ:int i = 0 かつ i < size の間 i++
weight = weight + X[i] * W[i]
sum = sum + W[i]
ループ終了
return (float)weight / sum
Step 2 → main() 内で
int X[] = {11, 22, 43, 34, 25, 16} を宣言
int W[] = {12, 12, 43, 54, 75, 16} を宣言
int size_X = sizeof(X)/sizeof(X[0]) を宣言
int size_W = sizeof(W)/sizeof(W[0]) を宣言
IF (size_X == size_W)
weightedmean(X, W, size_X) を呼び出す
ELSE
-1 を出力する
終了
停止
C++での実装例
#include<bits/stdc++.h>
using namespace std;
// 加重平均を計算する関数
float weightedmean(int X[], int W[], int size){
int sum = 0, weight = 0;
for (int i = 0; i < size; i++){
weight = weight + X[i] * W[i];
sum = sum + W[i];
}
return (float)weight / sum;
}
int main(){
int X[] = {11, 22, 43, 34, 25, 16};
int W[] = {12, 12, 43, 54, 75, 16};
int size_X = sizeof(X)/sizeof(X[0]);
int size_W = sizeof(W)/sizeof(W[0]);
if (size_X == size_W)
cout<<"weighted mean is : "<<weightedmean(X, W, size_X);
else
cout << "-1";
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
weighted mean is : 29.3019
実装のポイント
- 分子の「値 × 重み」の総和は int 型で大きくなりすぎる可能性があるため、必要に応じて long long 型の利用も検討しましょう。
- 整数同士の除算では小数点以下が切り捨てられるため、
(float)キャストを行ってから割り算している点が重要です。キャストしないと正確な加重平均が得られません。 - 配列のサイズは
sizeof(X)/sizeof(X[0])で動的に求めることで、データが変わってもコードを修正せずに済みます。
-
二分法を用いて方程式の根を求める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この公式を使えば、ループ処理を行わずに一発で答えを求めることが可能で