일반적인 거듭제곱 표현 O(N)

int func(int x, int n)
{
	int res = 1;
	for (int i = 0; i < n; i++)
		res *= x;
	return res;
}

장점: 작성이 쉽고 직관적임

시간복잡도 : 지수(n)만큼 계산하므로 O(N)




최적화 기법(분할 정복+재귀) : O(logN)


아이디어

짝수일 때 : 2의 8승을 2의 제곱을 구한다음 그것만 3번 곱해볼까?

홀수일 때 : 2의 7승을 2의6승을 짝수처럼 계산하고 거기다가 2를 곱해볼까?


시간복잡도: 지수를 반으로 나눠가며 계산하므로 O(logN) 


코드

#include<iostream>
using namespace std;
long long func(int x, int n);
int main()
{
	//2의 50승 구하기
	int x = 2;
	int n = 50;
	cout << "2의 50승은 " << endl;
	cout<<func(x, n) << "입니다." << endl;
}
long long func(int x, int n)
{
	if (x == 1)
		return 1;
	if (n == 1)
		return x;
	//지수가 홀수 일때 
	if (n % 2 == 1)
	{
		long long res = func(x, (n - 1) / 2);
		return (res * res) * x;
	}
	//지수가 짝수 일 때
	else
	{
		long long res = func(x, n / 2);
		return res * res;
	}
}

결과




+ Recent posts