설명
입력: 수(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
'Coding Problems(백준) > Cpp' 카테고리의 다른 글
백준 1009번 분산처리 C++ 풀이 (0) | 2021.10.25 |
---|---|
백준 17869번 Simple Collatz Sequence C++ 풀이 (0) | 2021.10.24 |
백준 1032번 명령 프롬프트 C++ 풀이 (0) | 2021.10.24 |
백준 2557번 Hello World C++ 풀이 (0) | 2021.10.23 |