Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어로 두 분수 비교하기: 교차 곱셈 기반 프로그램 구현

문제 개요

분자(nume)와 분모(deno)를 가진 두 분수가 주어졌을 때, 두 분수를 서로 비교하여 더 큰 쪽을 찾아내는 것이 이번 문제의 목표입니다. 예를 들어 1/2와 2/3을 비교한다고 해봅시다. 1/2의 실제 값은 0.5이고, 2/3의 값은 약 0.6667이므로 더 큰 분수는 2/3입니다.

입력

first.nume = 2, first.deno = 3
second.nume = 4, second.deno = 3

출력

4/3

설명

2/3 = 0.66667 < 4/3 = 1.33333

입력

first.nume = 1, first.deno = 2
second.nume = 4, second.deno = 3

출력

4/3

문제 해결 접근 방법

두 분수를 비교하는 가장 직관적인 방법은 각각 나눗셈을 수행한 뒤 실숫값을 비교하는 것입니다. 하지만 이 방식은 부동소수점 연산 과정에서 오차가 발생할 수 있어 정확도가 떨어질 우려가 있습니다.

이를 피하기 위해 교차 곱셈(cross multiplication) 기법을 사용합니다. 분모가 모두 양수라는 조건에서 두 분수 first(nume1/deno1)와 sec(nume2/deno2)를 비교할 때 다음과 같이 판별할 수 있습니다.

  • nume1 × deno2 > deno1 × nume2 → first가 더 큰 분수
  • nume1 × deno2 < deno1 × nume2 → sec가 더 큰 분수
  • nume1 × deno2 = deno1 × nume2 → 두 분수의 값이 같음

즉, Y = nume1 × deno2 − deno1 × nume2를 계산했을 때 Y가 양수이면 첫 번째 분수가 더 크고, 그렇지 않으면 두 번째 분수가 더 크거나 두 분수가 같습니다. 정수 연산만으로 비교가 가능하기 때문에 부동소수점 오차 없이 정확한 결과를 얻을 수 있다는 점이 이 방법의 가장 큰 장점입니다.

알고리즘

시작
  Fraction 구조체 선언 — 요소: nume, deno
  함수 Fraction greater(Fraction first, Fraction sec)
    단계 1 → 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;
};

// 두 분수 중 더 큰 분수 구하기
Fraction greater(Fraction first, Fraction sec){
    // 교차 곱셈 결과가 음수이면 두 번째 분수가 더 크고,
    // 그렇지 않으면 첫 번째 분수가 더 크거나 같다
    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("더 큰 분수는: %d/%d\n", res.nume, res.deno);
    return 0;
}

실행 결과

위 코드를 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.

더 큰 분수는: 4/5

실제로 검증해 보면 4/5 = 0.8이고 3/4 = 0.75이므로 4/5가 더 큰 분수임을 알 수 있습니다. 교차 곱셈으로 계산한 Y = 4×4 − 5×3 = 1 > 0 역시 동일한 결론을 줍니다.