-
[Java]거듭 제곱의 계산Algorithm/수학&기타 2021. 4. 20. 17:17
*거듭 제곱의 계산
-> 거듭 제곱을 구현하는 방법은 간단하다. 기본적으로는 그 정의 그대로 어떤 수를 n번 곱하여 거듭제곱을 구현 가능하다. 하지만 n번 곱하기 때문에 시간복잡도는 O(n)이 걸린다는 것을 알 수 있다.
*개선된 거듭 제곱의 계산
-> 이러한 거듭 제곱은 분할 정복을 기반으로 시간복잡도를 O(logN)까지 줄일 수 있다!
-> 기본적인 아이디어는 다음과 같다. 예를 들어 5^10을 계산한다고 생각하였을 때, 아래와 같은 과정을 거쳐서 그 값을 구하는 것 이다.
-> 따라서, 재귀를 이용하여 다음과 같은 거듭제곱을 구현할 수 있음을 알 수 있다.
*구현
-> 점화식도 구하였으니 그대로 구현하기만 해주면 된다.
import java.util.Scanner; public class Exponentiation { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long a = sc.nextInt(); // 밑 long b = sc.nextInt(); // 지수 System.out.println(pow(a, b)); sc.close(); } private static long pow(long a, long b) { // 지수가 0인 경우(종료 조건). if (b == 0) { return 1; } // 반으로 나눈 거듭제곱 계산. long res = pow(a, b / 2); // 지수가 짝수인 경우. if (b % 2 == 0) { return res * res; } // 지수가 홀수인 경우 else { return res * res * a; } } }
'Algorithm > 수학&기타' 카테고리의 다른 글
[Java]누적 합(Prefix Sum , Cumulative Sum) (1) 2021.04.22 페르마의 소정리(Fermat's Little Theorem) (0) 2021.04.20 모듈러 산술(Modular Arithmetic) (2) 2021.04.19 [Java]유클리드 호제법(Euclidean Algorithm) (0) 2021.04.19 [Java]좌표 이동/탐색 (0) 2020.09.25