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

C++로 x^y와 y^x 중 더 큰 값 비교하는 방법

이 문제에서는 두 개의 수 x와 y가 주어지며, 우리의 목표는 x^y와 y^x 중 어느 값이 더 큰지 찾는 것입니다.

문제 설명

문제 자체는 매우 간단합니다. x의 y제곱(x^y)과 y의 x제곱(y^x) 중 어느 쪽이 더 큰 값을 가지는지 판별하면 됩니다.

예시를 통해 문제를 살펴보겠습니다.

입력: x = 4, y = 5

출력: 1024

설명:

x^y = 4^5 = 1024
y^x = 5^4 = 625

두 값을 비교하면 1024 > 625이므로, x^y가 더 크고 결과값은 1024가 됩니다.

해결 접근 방법

가장 직관적인 해결 방법은 x^y와 y^x의 값을 직접 계산한 후 둘 중 최댓값을 반환하는 것입니다. 하지만 지수가 커질 경우 값이 기하급수적으로 증가하여 오버플로우가 발생할 수 있다는 단점이 있습니다.

이를 피할 수 있는 더 우아한 수학적 방법은 로그(log)를 활용하는 것입니다. 로그 함수는 단조 증가(monotonically increasing)하므로, 로그를 취해도 두 값의 대소 관계는 그대로 유지됩니다.

x^y의 자연로그를 취하면 다음과 같이 변환됩니다.

log(x^y) = y · log(x)

마찬가지로 log(y^x) = x · log(y)이므로, 결국 y·log(x)와 x·log(y)를 비교하는 것만으로 원래 문제를 해결할 수 있습니다. 로그 값은 계산이 간단하고, 아무리 큰 수라도 오버플로우 없이 안전하게 비교할 수 있다는 장점이 있습니다.

구현 예제

다음은 위 접근 방식을 C++로 구현한 코드입니다.

#include <bits/stdc++.h>
using namespace std;

int main() {
   double x = 3, y = 7;
   double ylogx = y * log(x);  // log(x^y)
   double xlogy = x * log(y);  // log(y^x)
   
   if(ylogx > xlogy)
      cout<<x<<"^"<<y;
   else if (ylogx < xlogy)
      cout<<y<<"^"<<x;
   else
      cout<<"None";
   cout<<" has greater value";
   return 0;
}

실행 결과

3^7 has greater value

위 코드에서 x = 3, y = 7인 경우, y·log(3) ≈ 7.69이고 x·log(7) ≈ 5.83이므로 ylogx가 더 큽니다. 따라서 프로그램은 "3^7 has greater value", 즉 3^7이 더 큰 값을 가진다고 출력합니다.

이처럼 로그를 활용하면 거듭제곱 값을 직접 계산하지 않고도 두 지수 표현식의 크기를 빠르고 안전하게 비교할 수 있습니다.