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

C++로 a^b와 b^a 중 어느 값이 더 큰지 비교하는 방법

이 튜토리얼에서는 두 수 abba 중 어느 쪽이 더 큰지 판별하는 프로그램을 C++로 작성해 보겠습니다.

문제 자체는 간단해 보이지만, 지수 값이 매우 커질 수 있기 때문에 실제 거듭제곱을 직접 계산하면 오버플로우가 발생할 위험이 있습니다. 이를 해결하기 위해 로그를 활용한 스마트한 접근 방식을 사용합니다.

해결 접근 방식

핵심 아이디어는 로그의 성질을 이용하는 것입니다. 양변에 로그를 취하면 비교 대상이 다음과 같이 변환됩니다.

  • a와 b의 값을 초기화합니다.
  • 두 값에 로그를 적용합니다.
  • $b\:\log\:a$와 $a\:\log\:b$를 계산합니다.
  • 두 값을 비교합니다.
  • $a\:\log\:b$가 $b\:\log\:a$보다 크면, ba가 더 큽니다.
  • $b\:\log\:a$가 $a\:\log\:b$보다 크면, ab가 더 큽니다.
  • 그 외의 경우에는 두 값이 같습니다.

로그 함수는 단조 증가(monotonically increasing)하기 때문에, 원래 값의 크기 관계가 로그 변환 후에도 그대로 유지됩니다. 따라서 거듭제곱을 직접 계산하지 않고도 안전하게 비교할 수 있습니다.

예제 코드

실제 구현 코드를 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;
int main() {
   int a = 4, b = 7;
   long double x = (long double) a * (long double)(log((long double)(b)));
   long double y = (long double) b * (long double)(log((long double)(a)));
   if (y > x) {
      cout << "a ^ b is greater" << endl;
   }else if (y < x) {
      cout << "b ^ a is greater" << endl;
   }else {
      cout << "Both are equal" << endl;
   }
   return 0;
}

실행 결과

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

a ^ b is greater

a = 4, b = 7인 경우, 47 = 16,384이고 74 = 2,401이므로 ab가 더 크다는 결과가 올바르게 출력됩니다.

마무리

이처럼 로그를 활용하면 매우 큰 지수 값도 오버플로우 없이 손쉽게 비교할 수 있습니다. 부동소수점 정밀도 문제를 고려해 long double 타입을 사용한 점도 눈여겨볼 만합니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.