【C++】投資額と投資期間から利益配分比率を計算するプログラム
本記事では、複数の出資者による投資額を格納した配列と、それぞれの投資期間を格納した配列が与えられたとき、利益配分比率(profit sharing ratio)を求めるC++プログラムを紹介します。
利益配分比率とは
組合企業(パートナーシップ)では、事業への出資額(資本)に応じて各パートナー間で損益が配分されます。この出資割合をもとに利益配分比率を計算することで、各パートナーが受け取るべき利益の額を決定できます。
計算式:
パートナー1 = 出資額 × 投資期間
パートナー2 = 出資額 × 投資期間
パートナー3 = 出資額 × 投資期間
…
パートナーn = 出資額 × 投資期間
利益配分比率 = パートナー1 : パートナー2 : パートナー3 : …
実行例
入力: amount[] = { 1000, 2000, 2000 }
time[] = { 2, 3, 4 }
出力: 利益配分比率 1 : 3 : 4
入力: amount[] = { 5000, 6000, 1000 }
time[] = { 6, 6, 12 }
出力: 利益配分比率 5 : 6 : 2
解き方のアプローチ
- 複数の出資者の投資額を格納する配列と、それぞれの投資期間を格納する配列を入力として受け取ります
- 各出資者について「投資額 × 投資期間」を計算します
- 計算した値全体の最大公約数(GCD)を求め、各値をGCDで割ることで最も簡単な整数比にします
- 最終的な比率を表示します
アルゴリズム
- GCD(最大公約数)を計算する関数を定義する
配列の先頭要素を初期値とし、残りの要素と順に最大公約数を求めて更新していきます。すべての要素を処理した結果を返します。 - 利益配分比率を計算する関数を定義する
各出資者について「投資額 × 投資期間」を別の配列に格納し、その配列のGCDを求めます。続いて、各要素をGCDで割った値を「 : 」で連結して出力します。 - main() 関数
投資額の配列・投資期間の配列を用意し、sizeof で配列サイズを計算してから cal_ratio() を呼び出します。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
// 最大公約数(GCD)を計算する関数
int GCD(int arr[], int size) {
int i;
int result = arr[0];
for (i = 1; i < size; i++)
result = __gcd(arr[i], result);
return result;
}
// 利益配分比率を計算して表示する関数
void cal_ratio(int amount[], int time[], int size) {
int i, arr[size];
// 投資額 × 投資期間 を計算
for (i = 0; i < size; i++)
arr[i] = amount[i] * time[i];
// GCDを求めて比率を簡約
int ratio = GCD(arr, size);
// 比率を出力
for (i = 0; i < size - 1; i++)
cout << arr[i] / ratio << " : ";
cout << arr[i] / ratio;
}
int main() {
int amount[] = { 1000, 2000, 2000 };
int time[] = { 2, 3, 4 };
int size = sizeof(amount) / sizeof(amount[0]);
cout << "profit sharing ratio ";
cal_ratio(amount, time, size);
return 0;
}
出力結果
profit sharing ratio 1 : 3 : 4
プログラムのポイント
__gcd()はGCCが提供する組み込み関数で、2つの整数の最大公約数を返します。<bits/stdc++.h>をインクルードすることで利用できます。- 「投資額 × 投資期間」という積は、金額と期間の両方を考慮した加重出資額を表します。
- 全体のGCDで各値を割ることで、これ以上約分できない最もシンプルな整数比を得られます。
-
sin(x)とcos(x)の値を計算するC++プログラムの解説
sin(x)とcos(x)の値を計算するC++プログラム 本記事では、角度を入力として受け取り、その角度に対応するsin(x)(正弦)とcos(x)(余弦)の値を計算して結果を表示するC++プログラムを解説します。ライブラリ関数に頼らず、テイラー展開(マクローリン展開)を用いて数値を近似する手法を紹介します。 sin(x)とは sin(x)は三角関数の一つで、角度xに対する正弦の値を求めるために使用されます。直角三角形では、斜辺に対する対辺の比として定義されます。 $$\sin (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k
-
グラフのエッジカバー(辺被覆)を求めるC++プログラムの解説
グラフの頂点数 n が与えられたとき、そのグラフのエッジカバー(辺被覆)を計算するのが本記事のテーマです。エッジカバーとは、グラフのすべての頂点を覆うために必要な最小の辺の数を見つける問題を指します。 エッジカバーとは 例として、頂点数 n = 5 のグラフを考えてみましょう。グラフは次のようになります。 このグラフのエッジカバーは 3 です。つまり、3本の辺を選ぶことで、5つの頂点すべてを覆うことができます。 次に、頂点数 n = 8 の場合を見てみましょう。 この場合のエッジカバーは 4 になります。 入出力例 入力: n = 5 出力: 3 入力: n = 8 出力: 4 計算の