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

C++에서 세 숫자의 공비를 구하는 프로그램 – 두 비율로 연비 계산하기

이 문제에서는 두 개의 비율, 즉 x:yy:z가 주어지며, 우리의 과제는 C++에서 세 숫자의 공비를 구하는 프로그램을 작성하는 것입니다.

문제 설명

주어진 두 비율을 이용해 세 숫자의 공비를 찾아야 합니다. x:y와 y:z라는 정보만 가지고 x:y:z 형태의 연비를 완성하는 것이 목표입니다.

예시로 문제 이해하기

입력

3:5 8:9

출력

24 : 40 : 45

풀이 설명 − x:y와 y:z라는 서로 다른 두 비율이 주어져 있습니다. x:y:z를 만들려면 두 비율에서 공통 항인 y를 같은 값으로 맞춰야 하는데, 이때 교차 곱셈(cross multiplication)을 활용합니다.

x/y₁ = y₂/z 이므로, 양변에 적절한 값을 곱해 다음과 같이 변형할 수 있습니다.

(x × y₂) : (y₁ × y₂) : (y₁ × z)

즉, 첫 번째 비율에는 y₂를, 두 번째 비율에는 y₁을 곱해 중간 항을 일치시키면 세 수의 비율 x′:y′:z′를 얻을 수 있습니다.

위 예시에 대입하면 3×8 : 5×8 : 5×9 = 24 : 40 : 45가 세 숫자의 공비가 됩니다.

풀이 접근 방법

앞서 살펴본 것처럼 두 비율의 가운데 항(y)을 동일하게 만드는 것이 핵심입니다. 단순한 교차 곱셈으로도 해결할 수 있지만, 입력 값이 클 경우 결과 숫자가 불필요하게 커질 수 있다는 단점이 있습니다. 따라서 더 효율적인 방법은 최소공배수(LCM)를 활용하는 것입니다.

y₁과 y₂의 최소공배수를 LCM이라 할 때, 세 수의 공비는 아래와 같이 계산됩니다.

x × (LCM ÷ y₁) : LCM : z × (LCM ÷ y₂)

솔루션 동작을 보여주는 예제 프로그램

#include <iostream>
using namespace std;

int calcLcm(int a, int b){
    int lcm = 2;
    while(lcm <= a*b) {
        if(lcm % a == 0 && lcm % b == 0) {
            return lcm;
            break;
        }
        lcm++;
    }
    return 0;
}

void calcThreeProportion(int x, int y1, int y2, int z){
    int lcm = calcLcm(y1, y2);
    cout << ((x*lcm)/y1) << " : " << lcm << " : " << ((z*lcm)/y2);
}

int main() {
    int x = 12, y1 = 15, y2 = 9, z = 16;
    cout << "The ratios are\t" << " x:y = " << x << ":" << y1 << "\ty:z = " << y2 << ":" << z << endl;
    cout << "The common ratio of three numbers is\t";
    calcThreeProportion(x, y1, y2, z);
    return 0;
}

출력 결과

The ratios are x:y = 12:15 y:z = 9:16
The common ratio of three numbers is 36 : 45 : 80

코드 설명

calcLcm() 함수는 반복문을 통해 두 수 y₁과 y₂의 최소공배수를 찾습니다. calcThreeProportion() 함수는 구한 최소공배수를 기준으로 각 항을 계산하여 x:y:z 형태의 최종 공비를 출력합니다. 위 예제에서는 LCM(15, 9) = 45이므로, 12×(45÷15) : 45 : 16×(45÷9) = 36 : 45 : 80이 결과로 나타납니다.