C言語で2つの分数を比較して大きい方を求めるプログラム
分子 nume1・nume2 と、それぞれに対応する分母 deno1・deno2 を持つ2つの分数が与えられたとき、両者を比較してより大きい方の分数を求めるのが本記事の課題です。たとえば分数 1/2 と 2/3 を比べた場合、1/2 の値は 0.5、2/3 の値は約 0.66667 となるため、大きいのは 2/3 です。
入出力例
例1
入力:
first.nume = 2, first.deno = 3 second.nume = 4, second.deno = 3
出力:
4/3
説明:
2/3 = 0.66667 < 4/3 = 1.33333
例2
入力:
first.nume = 1, first.deno = 2 second.nume = 4, second.deno = 3
出力:
4/3
問題を解くためのアプローチ
この問題は「交差乗算(クロス掛け算)」という手法を用いて解きます。分数 a/b と c/d を比較する際、実際に除算を行わなくても、a×d と b×c の大小関係を見ればどちらの分数が大きいかを判定できます。
具体的には、first.nume × sec.deno − first.deno × sec.nume の計算結果(Y)が正であれば first の方が大きい分数であり、それ以外の場合は sec の方が大きい(または等しい)と判断します。この方法なら浮動小数点数の丸め誤差を気にせず、整数演算だけで正確に比較できる点が大きな利点です。
アルゴリズム
開始
メンバ nume, deno を持つ構造体 Fraction を宣言する
関数 Fraction greater(Fraction first, Fraction sec) 内
ステップ1 → 変数 Y を宣言し、Y = first.nume * sec.deno - first.deno * sec.nume で初期化する
ステップ2 → (Y > 0) ? first : sec を返す
関数 int main() 内
ステップ1 → Fraction first = { 4, 5 } を宣言する
ステップ2 → Fraction sec = { 3, 4 } を宣言する
ステップ3 → Fraction res = greater(first, sec) を宣言する
ステップ4 → res.nume と res.deno を出力する
終了サンプルコード
#include <stdio.h>
struct Fraction {
int nume, deno;
};
// 2つの分数のうち大きい方を返す
Fraction greater(Fraction first, Fraction sec){
// 結果が負であれば2番目の分数が大きく、
// それ以外は1番目の分数が大きい
int Y = first.nume * sec.deno - first.deno * sec.nume;
return (Y > 0) ? first : sec;
}
int main(){
Fraction first = { 4, 5 };
Fraction sec = { 3, 4 };
Fraction res = greater(first, sec);
printf("The greater fraction is: %d/%d\n", res.nume, res.deno);
return 0;
}出力
上記のコードを実行すると、以下のような出力が得られます。
The greater fraction is: 4/5
この結果は次のように確認できます。Y = 4 × 4 − 5 × 3 = 16 − 15 = 1 となり、Y が正であるため first(4/5)が返されます。実際、4/5 = 0.8 は 3/4 = 0.75 より大きいため、正しく判定できていることが分かります。
-
【C言語】strncmpライブラリ関数を使って2つの文字列を比較するプログラムの作り方
strncmpは、C言語のヘッダーファイル「string.h」に定義されている標準ライブラリ関数の一つです。この関数を使用すると、2つの文字列を比較し、どちらの文字列が大きい(辞書順で後ろにある)のかを判定することができます。 strcmp関数(文字列比較) strcmp関数は、2つの文字列を比較するための関数です。戻り値として、両方の文字列の中で最初に一致しなかった文字同士のASCIIコードの差を返します。 構文 int strcmp(string1, string2); 差が0の場合:string1 = string2(2つの文字列は等しい) 差が正の値の場合:string1 &
-
C++で3次元空間における2つの平面間の角度を計算する方法
本記事では、3次元空間内にある2つの平面 P1 と P2 の間の角度を求める方法を解説します。平面の方程式と角度の公式平面 Pi の方程式は、一般に次の形式で表されます。a・x + b・y + c・z + d = 0ここで、係数 (a, b, c) は平面の法線ベクトルを表しています。2つの平面がなす角度を「A」とすると、それぞれの法線ベクトルのなす角として、次の式で求められます。cos A = (a₁a₂ + b₁b₂ + c₁c₂) / (√(a₁² + b₁² + c₁²) × √(a₂² + b₂² + c₂²))つまり、分子は2つの法線ベクトルの内積、分母はそれぞれの法線ベクトルの大