Post

[백준BOJ2745 C++] 진법 변환

[백준BOJ2745 C++] 진법 변환

문제

https://www.acmicpc.net/problem/2745


풀이

  1. 진법

    B진법인 N을 10진법으로 바꿔 출력하는 프로그램을 작성하기 위해서는 진법의 원리를 이해해야 된다.

    image

    B진법을 10진법으로 바꾸기 위해서는 N = a * x^n + b * x^(n-1) + … z * x^0 형태로 변환해야 된다. 2진법 외에도 다른 진법에서 해당 식을 이용할 수 있다.

  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

  3. 출력 항상 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의 거듭제곱을 계산한다.

This post is licensed under CC BY 4.0 by the author.