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

C++에서 x^(y^2)와 y^(x^2) 중 더 큰 값 찾기: 자연로그를 활용한 효율적인 비교 방법

문제 소개

이 문제에서는 두 값 x와 y가 주어졌을 때, x^(y^2)와 y^(x^2) 중 어느 쪽이 더 큰지 판별하는 것이 과제입니다.

구체적인 예시를 통해 문제를 살펴보겠습니다.

입력: x = 4, y = 3

출력: 3^(4^2)

풀이 설명:

x^(y^2) = 4^(3^2) = 4^9 = 262144
y^(x^2) = 3^(4^2) = 3^16 = 43046721

두 값을 비교해 보면 43,046,721이 더 크므로 정답은 y^(x^2), 즉 3^(4^2)입니다.

해결 접근 방식

두 값을 직접 계산한 후 비교하는 방법도 있지만, x와 y의 값이 커지면 결과값이 기하급수적으로 폭증하여 정수 오버플로우가 발생하기 때문에 실전에서는 사용할 수 없습니다.

이럴 때 유용한 것이 바로 자연로그(ln)입니다. 로그를 취하면 거대한 지수 연산을 훨씬 작은 곱셈 연산으로 변환할 수 있습니다.

각 식의 양변에 자연로그를 적용하면 다음과 같습니다.

ln(x^(y^2)) = (y^2) × ln(x)

ln(y^(x^2)) = (x^2) × ln(y)

그런데 이 값들은 x, y에 단순히 정비례하지 않기 때문에, 양쪽을 공통항인 (x^2) × (y^2)로 나누어 비교를 단순화할 수 있습니다.

ln(x^(y^2)) ÷ ((x^2) × (y^2)) = ln(x) / (x^2)

ln(y^(x^2)) ÷ ((x^2) × (y^2)) = ln(y) / (y^2)

결국 비교 대상은 ln(x)/x² 와 ln(y)/y² 가 되며, 이 값들은 원래 결과값과 반비례 관계에 있습니다.

따라서 다음과 같은 결론을 얻을 수 있습니다.

x > y이면 x^(y^2) < y^(x^2), 반대로 x ≤ y이면 x^(y^2) ≥ y^(x^2)가 성립합니다.

솔루션 구현 코드

위 논리를 C++ 코드로 구현하면 다음과 같습니다.

#include <iostream>
using namespace std;

bool checkGreaterVal(int x, int y) {
    // x > y이면 y^(x^2)가 더 크므로 false 반환
    if (x > y)
        return false;
    else
        return true;
}

int main() {
    int x = 3;
    int y = 5;
    cout<<"The greater value is ";
    if(checkGreaterVal(x, y))
        cout<<x<<"^("<<y<<"^2)";
    else
        cout<<y<<"^("<<x<<"^2)";
    return 0;
}

실행 결과

The greater value is 3^(5^2)

코드 설명

checkGreaterVal 함수는 x가 y보다 클 경우 false를 반환해 y^(x^2)가 더 크다는 신호를 보내고, 그 외의 경우에는 true를 반환해 x^(y^2)가 더 크거나 같음을 알립니다. main 함수에서는 이 반환값에 따라 해당하는 식을 화면에 출력합니다. 위 예제에서는 x = 3, y = 5이므로 x < y에 해당하며, 따라서 3^(5^2)가 더 큰 값으로 출력됩니다.