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

C++로 a의 b제곱(a^b)에 가장 가까운 x의 배수 구하기

세 개의 값 a, b, x가 주어졌을 때, ab(a의 b제곱)에 가장 가까운 x의 배수를 구하는 문제입니다. 예를 들어 x = 4, a = 3, b = 3이라면 출력 결과는 28이 됩니다. 33 = 27이며, 27에 가장 가까운 4의 배수가 28이기 때문입니다.

문제 해결 접근 방식

해결 방법은 간단합니다. 다음 조건들을 순서대로 확인하면 됩니다.

  • b < 0이고 a = 1인 경우: ab는 1이 되므로, 가장 가까운 x의 배수는 0 또는 x입니다.

  • b < 0이고 a > 1인 경우: ab는 1보다 작은 값이 되므로, 가장 가까운 x의 배수는 0입니다.

  • b > 0인 경우: 먼저 ab를 계산한 뒤, mul = ab / x의 정수 부분으로 정의하면, 가장 가까운 x의 배수는 mul * x 또는 (mul + 1) * x 중 하나입니다. 두 값 중 ab와의 차이가 더 작은 쪽을 선택하면 됩니다.

C++ 구현 예제

#include<iostream>
#include<cmath>
using namespace std;

void findMultiple(int a, int b, int x) {
    cout << "Nearest multiple: ";
    if (b < 0) {
        if (a == 1 && x == 1)
            cout << "1";
        else
            cout << "0";
        return;
    }
    int mul = pow(a, b);
    int ans = mul / x;
    int ans1 = x * ans;
    int ans2 = x * (ans + 1);
    if ((mul - ans1) <= (ans2 - mul)) {
        cout << ans1;
    } else {
        cout << ans2;
    }
}

int main() {
    int a = 3, b = 3, x = 4;
    findMultiple(a, b, x);
}

실행 결과

Nearest multiple: 28

동작 원리 설명

위 코드의 핵심 로직은 다음과 같습니다.

  1. pow(a, b) 함수로 ab 값을 계산합니다.

  2. ab를 x로 나눈 몫(ans)을 구한 후, 이를 이용해 바로 아래 배수(ans1 = ans * x)와 바로 위 배수(ans2 = (ans + 1) * x)를 계산합니다.

  3. ab와 두 배수 사이의 거리를 비교하여 더 가까운 값을 출력합니다. 두 거리가 같다면 더 작은 배수(ans1)를 선택합니다.

예제에서는 33 = 27이고, 27 ÷ 4의 몫은 6이므로 후보 배수는 24(6 × 4)와 28(7 × 4)입니다. |27 − 24| = 3이고 |28 − 27| = 1이므로 더 가까운 28이 최종 결과로 출력됩니다.