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

C++에서 숫자의 세제곱근 구하기: 이진 탐색 알고리즘으로 직접 구현하기

개요

이 글에서는 C++에서 숫자의 세제곱근(cubic root)을 구하는 방법을 알아봅니다. 예를 들어 27의 세제곱근은 3입니다. 일반적으로 cbrt() 같은 라이브러리 함수를 사용할 수 있지만, 여기서는 라이브러리 함수에 의존하지 않고 직접 로직을 구현해 보겠습니다.

가장 효율적인 방법은 이진 탐색(Binary Search)을 활용하는 것입니다. 세제곱 함수는 단조 증가(monotonically increasing)하기 때문에, 답이 존재하는 범위를 절반씩 좁혀 가며 원하는 정밀도에 도달할 때까지 반복하면 됩니다.

알고리즘 동작 방식

먼저 오차 허용 범위인 임계값(threshold)을 설정합니다. 여기서는 threshold = 0.000001을 사용합니다. 그다음 아래 단계를 따릅니다.

  • 탐색 범위의 왼쪽 값(left)을 0으로, 오른쪽 값(right)을 입력 숫자로 초기화합니다.
  • 중간값을 계산합니다: mid = (left + right) / 2
  • |number − mid³|의 절댓값이 임계값보다 작으면, mid를 정답으로 반환합니다.
  • mid³이 number보다 크면, right 값을 mid로 갱신합니다.
  • mid³이 number보다 작으면, left 값을 mid로 갱신합니다.

이 과정을 반복하면 탐색 범위가 지수적으로 줄어들어 매우 빠르게 수렴합니다. 시간 복잡도는 O(log(N/ε))로, ε은 요구되는 정밀도입니다.

C++ 구현 예제

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

double cubeRoot(int num) {
    double threshold = 0.000001;
    double left = 0, right = num;
    double mid;
    while(left <= right){
        mid = (left + right)/2;
        if(abs(num - (mid*mid*mid)) < threshold)
            return mid;
        if((mid*mid*mid) > num)
            right = mid;
        if((mid*mid*mid) < num)
            left = mid;
    }
}

int main() {
    int n = 3;
    cout << "cube root of 3 is: " << cubeRoot(n);
}

실행 결과

cube root of 3 is: 1.44225

코드 설명

위 예제에서는 3의 세제곱근을 구합니다. 실제 값은 약 1.442249이며, 프로그램은 임계값 0.000001 이내의 오차로 1.44225를 출력합니다.

루프가 한 번 실행될 때마다 탐색 범위가 절반으로 줄어들기 때문에, 큰 숫자라도 몇십 번의 반복 만에 정답에 도달합니다. 또한 abs(num - mid³) 조건 덕분에 부동소수점 연산의 미세한 오차를 감안하면서도 충분히 정확한 결과를 얻을 수 있습니다.

참고 사항

입력 숫자가 0과 1 사이인 경우(예: 0.125의 세제곱근은 0.5), 세제곱근이 원래 숫자보다 커지므로 탐색 범위를 [0, max(1, num)]으로 설정하는 것이 안전합니다. 음수 입력을 처리하려면 절댓값의 세제곱근을 구한 뒤 부호를 붙이는 방식으로 확장할 수 있습니다.