[Java] 제곱근 계산

hyoreal·2022년 8월 25일
0

[Algorithm]

목록 보기
2/2
post-thumbnail

문제

수를 입력받아 제곱근 값을 소수접 두 자리까지 리턴해야 합니다.

입력

인자 1: num

  • int 타입의 정수 (num >= 2)

출력

  • String 타입 리턴
  • 최대 소수점 둘째자리까지 구한 수를 문자열로 변환하여 출력

주의

  • Math.sqrt 금지

이 문제는 꽤나 전에 수학문제로 포기했던 문제이다.
하지만 지금은 풀 수 있지 않을까 싶은 마음에 재도전해본다.

먼저 제곱근은 제곱의 반대 개념으로 "제곱하여 그 수가 되는 수" 를 말한다.
즉, 위 문제는 9를 입력받았다면 3을 리턴하라는 말인데 최대소수점 둘째자리까지 구해라라는 조건이 붙었다.
둘째자리까지 구하라는 것은 셋째자리에서 반올림을 하라는 이야기이다.

Math.sqrt 없이 어떻게 제곱근을 구해야하나 고민하던 중 바빌로니아 법의 점화식 있다는 것을 알았다.

바빌로니아 법

  • 바빌로니아 법 (The Babylonian Method)

    • 임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근사값을 구하는 방법
    1. 임의의 양의 실수의 근사값을 추정하여 xnx_n에 넣어주고
    2. xnx_n+1=12\frac{1}{2}(xnx_n+axn\frac{a}{x_n})= xn2+a2xn\frac{x_n^2+a}{2x_n}
    3. 원하는 정밀도에 이를때까지 2의 과정 반복

이라고 한다.
그래서 내가 이해한것과 맞게 식을 구성해봤다.

double multi = 1; // (1)
int count = 0;

while (true) { // (2)
  if (multi * multi == num) { // (2-1)
    return String.format("%.2f", multi);
  } else if (multi * multi > num) { // (2-2)
    multi -= 1;
    break;
  }
  multi++;
}

while (true) { // (3)
  count++;
  if(count  == 3) {
    return String.format("%.2f", multi);
  }
  multi = (multi + (num / multi)) / 2;
}
  1. 근사값을 multi로 선언했다. count는 (3)반복문에서 쓰일 예정이다.

  2. 근사값을 제곱하며 num과 같거나 num보다 큰 근접한 수가 될 때까지 반복문을 실행한다.

    2-1. 근사값의 제곱이 num과 같은 수가 됐다면 String.format()메서드를 이용하여 소수점 둘째자리까지 나타내도록 하였다.
    즉, 근사값이 3이 되었다면 3.00으로 변환시켜주는 것이다.

    2-2. 근사값의 제곱이 num보다 커지면 근사값의 제곱에서 1을 뺀 수를 갖고 반복문을 벗어난다.

    • 예시
      • num = 8
      • 근사값 = 1 → 2 → 3
      • 근사값 제곱 = 1 → 4 → 9
      • 9 > num (반복문 종료조건)
      • 9 - 1
      • 8 (반복문 종료)
  3. 바빌로니아 법의 점화식이 실행되는 반복문이다.
    반복문이 한번 돌때마다 count가 1씩 더해지고 count가 3이 되면 반복문은 종료된다.
    count가 3이 되면 종료되는 이유는 소수점 셋째자리에서 반올림을 해주어야하기위함이다.
    multi = (multi + (num / multi)) / 2;
    이 식이 바로 바빌로니아 법의 점화식을 응용한 식이다.

위와 같이 구성했더니 원했던 결과가 나왔다.
프로그래밍을 배우다가 수학까지 배우고있으니 일석이조인거라고 생각하자!!
그렇게 오늘도 뿌듯함 적립!!

profile
좌충우돌 코린이 성장기

0개의 댓글