Coding Problems(백준)/Cpp

백준 2745번 진법 변환 C++ 풀이

곰코딩 2021. 10. 29. 00:04

 

 

 

곰코딩 블로그 C++ 문제풀이 로고

 

 

설명

입력: 수(0~9, A~Z), 진법(2~36)
출력: 10진법 수

 

입력에서 진법의 수와 진법을 입력받고
이를 10진법으로 변환한 값을 출력한다.

ex) 1010 2  => 10

 

링크

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

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

 

문제 해설

 

전체적인 코드는 다음과 같습니다.


#include <iostream>
#include <string>

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

	std::string number;
	std::int32_t notation;
	std::int64_t result = 0;

	std::cin >> number >> notation;

	std::reverse(number.begin(), number.end());

	for (int i = 0; i < number.length(); i++) {
		if ('A' <= number.at(i) && number.at(i) <= 'Z') {
			result += (number.at(i) - 'A' + 10) * (std::pow(notation, i));
		} else {
			result += (number.at(i) - '0') * (std::pow(notation, i));
		}
	}

	std::cout << result;

}

b진법을 10진법으로 바꾸는 원리는 간단합니다.

자리수가 올라갈때마다 b의 자리수 제곱을 곱하는 것이지요.

 

예를 들어 2진법은 자리수가 올라갈때 마다 2, 4, 8, 16만큼의 크기를 갖고,

16진법은  16, 256, 4096 ...의 크기를 갖습니다.

 

마치 10진법에서 한자리씩 증가할때마다. 10, 100, 1000, 10000의 크기를 갖는 것 처럼 말이죠..

 

위 코드를 간단히 설명하자면 입력은 int로 받을 수가 없어서 string형식으로 받았고

문자열의 첫번째 문자가 가장 큰 수 인 것이 처리하기 불편해서 문자열을 뒤집었습니다.

또한 ,각 문자열은 아스키 코드 값을 빼서 정수처럼 연산하였습니다.

 

char형을 연산 형태에 맞게 변환하고 계산을 해야 안전하지만

로직이 복잡해지기 때문에 그 부분을 생략했습니다.

 

풀이 코드 링크

https://github.com/dhk1999/coding_problems/blob/main/baekjoon/cpp/problem_2745.cpp

 

GitHub - dhk1999/coding_problems: 코딩 문제 모음

코딩 문제 모음. Contribute to dhk1999/coding_problems development by creating an account on GitHub.

github.com