[백준BOJ2745 C++] 진법 변환
문제
https://www.acmicpc.net/problem/2745
풀이
-
진법
B진법인 N을 10진법으로 바꿔 출력하는 프로그램을 작성하기 위해서는 진법의 원리를 이해해야 된다.
B진법을 10진법으로 바꾸기 위해서는 N = a * x^n + b * x^(n-1) + … z * x^0 형태로 변환해야 된다. 2진법 외에도 다른 진법에서 해당 식을 이용할 수 있다.
-
계산
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 즉, A는 10, B는 11… 이런 식으로 숫자를 지정해야 된다.
입력받은 값이 string 형태의 알파벳 대문자일 경우 int(N[i])로 통해 아스키코드값을 받고 ‘A’와 비교한다. True일 경우 알파벳 대문자를 아스키코드를 이용해 (int(N[i]) - 55)로 변환한다 (A→10) False일 경우에도 string 형태의 숫자이기 때문에 아스키코드를 이용해 (int(N[i]) - 48)로 변환한다. (참조:string 타입의 “1”은 아스키코드에서 49로 나타나기 때문에 48을 빼줘야 한다)
공통적으로 pow(B, l - 1 - i);을 곱해줬는데 위에 올린 사진처럼 x^n ~ x^0를 각 자릿수에 맞게 곱해주기 위함이다. 다만 1234를 기준으로 자릿수가 4자리지만 위 사진대로 10^3부터 곱해주기 때문에 l - 1을 작성하고 이 뒤에는 i값도 추가로 빼주어 원활한 계산이 되도록 한다.
ex. l = 4, i = 0~3까지 반복
4-1-0 = 3
4-1-1 = 2
4-1-2 = 1
4-1-3 = 0
출력 항상 10억보다 작거나 같은 형태라면 long long int를 작성해둔다.
제출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int B; long long int ans = 0;
string N;
cin >> N >> B;
int l = N.length();
for (int i = 0; i < l; i++) {
if (int(N[i]) >= 'A') ans += (int(N[i]) - 55) * pow(B, l - 1 - i);
else ans += (int(N[i]) - 48) * pow(B, l - 1 - i);
}
cout << ans;
return 0;
}
메모
-
pow(x, y)
pow() 함수는 y를 지수로 하는 x의 거듭제곱을 계산한다.