수의 거듭제곱은 반복적인 곱셈이나 프로그래밍 언어에서 기본 제공하는 함수를 통해 손쉽게 계산할 수 있습니다.
이번 글에서는 2의 n제곱(2n) 값을 구하고, 그 결과값이 몇 자리 숫자인지 알아내는 방법을 다룹니다. 먼저 예시를 통해 문제를 살펴보겠습니다.
입력
5
출력
2
2의 5제곱은 32이므로 자릿수는 2입니다.
입력
10
출력
4
2의 10제곱은 1024이므로 자릿수는 4입니다.
알고리즘
- 숫자 n을 초기화합니다.
- 2n의 값을 구합니다.
- 상용로그(log10) 값의 올림(ceil)을 취하면 해당 숫자의 자릿수를 얻을 수 있습니다.
- 계산된 값을 반환합니다.
이 방법이 성립하는 원리는 다음과 같습니다. 어떤 수 N의 자릿수는 ⌊log₁₀N⌋ + 1로 표현됩니다. 2n은 정확히 10의 거듭제곱이 될 수 없기 때문에, ⌈log₁₀(2n)⌉ = ⌊log₁₀(2n)⌋ + 1이 항상 만족되어 올림 연산 하나만으로 자릿수를 바로 구할 수 있습니다.
C++ 구현
다음은 위 알고리즘을 C++로 구현한 코드입니다.
#include <bits/stdc++.h>
using namespace std;
int getDigitsCount(int n) {
return ceil(log10(pow(2, n)));
}
int main() {
int n = 8;
cout << getDigitsCount(n) << endl;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
3
n이 8일 때 28 = 256이므로 자릿수는 3이 됩니다.
참고: 큰 수 처리 시 주의점
n이 커지면 pow(2, n)의 결과가 부동소수점 타입의 표현 범위를 넘어서거나 정밀도 손실이 발생할 수 있습니다. 이런 경우에는 2n을 직접 계산하지 말고 log₁₀(2n) = n × log₁₀2라는 성질을 활용하여 ceil(n * log10(2)) 형태로 계산하면 훨씬 안전하고 효율적으로 자릿수를 구할 수 있습니다.