C++で2つの有理数のうち大きい方(最大値)を求める方法
問題概要
この問題では、2つの有理数が与えられ、そのうち大きい方(最大値)を見つけることが課題となります。
ここで扱う有理数は、p/q の形式(分数形式)で表されるものとします。
具体例で問題を理解しよう
入力:rat1 = 5/4、rat2 = 3/2
出力:3/2
説明:
5/4 = 1.25
3/2 = 1.5
小数に変換して比較すると、1.5 の方が大きいため、答えは 3/2 となります。
解法のアプローチ
この問題は、学校の数学で習った方法と同じ考え方で解くことができます。
手順は以下の通りです。
- まず、2つの分母の最小公倍数(L.C.M.)を求めます。
- 次に、各分数の分子を、分母を最小公倍数に揃えるために必要な倍率で掛け合わせます。
- 共通の分母に揃えた後は、分子が大きい方の有理数が最大値となります。
解法の動作を示すプログラム
コード例
#include <bits/stdc++.h>
using namespace std;
int findLCM(int a, int b) {
return (a * b) / (__gcd(a, b));
}
void maxRational(int ratOneNum, int ratOneDen, int ratTwoNum, int ratTwoDen) {
int k = findLCM(ratOneDen, ratTwoDen);
int oneNum = ratOneNum * k / (ratOneDen);
int twoNum = ratTwoNum * k / (ratTwoDen);
if(oneNum > twoNum)
cout<<ratOneNum<<"/"<<ratOneDen;
else
cout<<ratTwoNum<<"/"<<ratTwoDen;
}
int main() {
int ratOneNum = 5;
int ratOneDen = 4;
int ratTwoNum = 3;
int ratTwoDen = 2;
cout<<"The maximum of the two rational Numbers is ";
maxRational(ratOneNum, ratOneDen, ratTwoNum, ratTwoDen);
return 0;
}出力結果
The maximum of the two rational Numbers is 3/2
まとめ
このように、分母の最小公倍数を使って両方の有理数を通分し、分子同士を比較するだけで、浮動小数点数への変換による誤差を気にせずに正確な比較を行うことができます。計算量も最小公倍数の計算のみで済むため、非常に効率的な手法です。
-
C++で有理数の最小公倍数(LCM)を求める方法
本記事では、有理数(分数)の最小公倍数(LCM)を求める方法を解説します。例えば、{2/7, 3/14, 5/3} という有理数のリストが与えられた場合、そのLCMは 30/1 となります。 有理数のLCMを求める公式 この問題を解くには、まずすべての分子のLCM(最小公倍数)を計算し、次にすべての分母のGCD(最大公約数)を計算します。有理数のLCMは、次の式で表されます。 $$LCM = \frac{すべての分子のLCM}{すべての分母のGCD}$$ 各分数の倍数となる有理数は、分子がすべての分子の公倍数であり、かつ分母がすべての分母の公約数である必要があります。その中で最小のものが「分子
-
C++で再帰やユークリッドの互除法を使わずに2つの数の最大公約数(HCF)を求める方法
最大公約数(HCF、GCDとも呼ばれます)は、通常「ユークリッドの互除法」を使えば簡単に計算できます。しかし、この記事では、ユークリッドの互除法や再帰的なアルゴリズムに頼らずに、GCD(HCF)を求める方法を紹介します。例として、16と24という2つの数を考えます。この2つの数の最大公約数は8です。アルゴリズムの考え方ここでのアプローチは非常にシンプルです。手順は以下のとおりです。1. まず、2つの数のうち小さい方の値を取得します。2. 大きい方の数が小さい方の数で割り切れる場合、その小さい方の数がそのままHCFとなります。3. 割り切れない場合は、小さい方の数の半分(min / 2)から2ま