혜랑's STORY

[BOJ_C++] 11816번 : 8진수, 10진수, 16진수 본문

무지성 공부방/알고리즘 해결

[BOJ_C++] 11816번 : 8진수, 10진수, 16진수

hyerang0125 2021. 7. 2. 12:12

문제

 

풀이

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int hex(string x) {
	int sum = 0, flag = 1;
	for (int i = x.length() - 1; i > 1; i--) {
		if (x[i] >= 'a')
			sum += (x[i] - 'a' + 10) * flag;
		else
			sum += (x[i] - '0') * flag;
		flag *= 16;
	}
	return sum;
}

int oct(string x) {
	int sum = 0, flag = 1;
	for (int i = x.length() - 1; i > 0; i--) {
		sum += (x[i] - '0') * flag;
		flag *= 8;
	}
	return sum;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	string x;
	cin >> x;

	if (x[0] == '0') {
		if (x[1] == 'x')
			cout << hex(x);
		else
			cout << oct(x);
	}
	else
		cout << x;

	return 0;
}
  • 먼저 x의 0번째가 0이면 16진수 또는 8진수이다. 따라서 1번째 자리도 확인하여 'x'라면 16진수 변환 함수를 호출하고, 아니면 8진수 변환 함수를 호출한다.
  • 16진수 변환 함수는 x의 뒤에서 부터 해당 숫자와 flag를 곱하여 sum에 더한다. 이때 x[i]가 알파벳일 경우 'a'를 빼고 10을 더해 숫자로 변환한다. 이외의 경우는 '0'을 뺀다.
  • 8진수 변환 함수는 16진수 변환 함수와 동일하게 x의 뒤에서 부터 해당 숫자와 flag를 곱하여 sum에 더한다. 이때 8진수는 0에서 7의 숫자로 구성되기 때문에 그냥 '0'을 빼서 숫자로 변환한 뒤 계산한다.

 

결과