JUNGOL 실력키우기 수학2 - 이진수 | 10진수를 2, 8, 16진수로 | 진법 변환
기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.
실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.
이번 포스팅에서는 수학2의 진법 변환 시리즈를 풀어보겠습니다.
2814 : 이진수
기본적으로 입력은 최대 30자리가 넘기 때문에 문자열로 받아야 합니다.
이후에는 가장 마지막 자리에서부터 처음 까지(end -> 0)를 순회하며 1부터 2씩 곱해가며 해당 값과 곱해 값을 누적하면 됩니다.
저는 reverse_iterator를 사용했는데 단순히 bStr.Size() - 1에서 1씩 감소시켜 0 이상까지 반복하는 방법도 있습니다.
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string bStr;
cin >> bStr;
int num{ 0 }, val{ 1 };
for (string::reverse_iterator c{ bStr.rbegin() }; c != bStr.rend(); c++)
{
num += ((*c) - '0') * val;
val *= 2;
}
cout << num << endl;
}
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2080&sca=2040
JUNGOL | 이진수 > 문제은행
컴퓨터는 내부적으로 0과 1 두 개의 숫자만을 사용하여 모든 프로그램이 동작된다. 이렇게 두 개의 숫자만으로 이루어진 수를 이진수라 한다. 2진수를 입력받아 10진수로 변환하여 출력하는 프로그램을 작성하시오. 0과 1로만 이루어져 있는 30자리 이하의 2진수를 입력받는다. 입력된 2진수를 10진수로 변환하여 출력한다.
www.jungol.co.kr
1534 : 10진수를 2, 8, 16진수로
입력된 10진수를 다른 진법으로 바꾸는 것은 해당 값을 진법으로 나눈 나머지를 저장하고 그것을 거꾸로 출력하면 됩니다.
예를 들어 27을 2진수로 변환하는 것은 다음과 같습니다.
2 27
13 ... 1
6 ... 1
3 ... 0
1 ... 1
결과 : 11011
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int n, b;
cin >> n >> b;
string result;
while (n > 0)
{
int rest = (n % b);
if (rest < 10)
result.push_back('0' + rest);
else
result.push_back('A' + rest - 10);
n /= b;
}
for (int i = result.size() - 1; i >= 0; --i)
{
cout << result[i];
}
cout << endl;
}
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=806&sca=2040
JUNGOL | 10진수를 2,8,16진수로 > 문제은행
10진수를 입력 받아서 2, 8, 16진수로 바꾸어 출력하는 프로그램을 작성하시오. 입력의 첫줄에는 10진수 N(1≤N≤100,000)과 바꿀 진수 B(2, 8, 16)가 공백으로 구분하여 입력된다. 16진수에서 10이상의 수는 순서대로 'A', 'B', 'C', 'D', 'E', 'F'로 나타낸다. 입력받은 10진수를 B진수로 바꾸어 출력한다.
www.jungol.co.kr
3106 : 진법 변환
이 문제에 함정이 몇 가지 있는데 0이 입력됐을 때 처리를 따로 해줘야 한다는 점과 입력되는 값의 범위가 2^63 -1이라는 큰 범위를 가지고 있다는 점입니다.
다시 쓰면 다음을 주의해야 합니다.
- 0에 대한 예외처리
- int 대신 long 사용 필요
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int a, b;
string n;
while (true)
{
cin >> a;
if (a == 0)
break;
cin >> n >> b;
// a진수 -> 10진수 변환
long num{ 0 }, val{ 1 };
for (int i = n.size() - 1; i >= 0; --i, val *= a)
{
if(n[i] <= '9')
num += (n[i] - '0') * val;
else
num += (n[i] - 'A' + 10) * val;
}
// 10진수 -> b진수 변환
string result;
while (num > 0)
{
long rest = (num % b);
if (rest < 10)
result.push_back('0' + rest);
else
result.push_back('A' + rest - 10);
num /= b;
}
// 0 예외처리
if (result.size() == 0)
result.push_back('0');
for (int i = result.size() - 1; i >= 0; --i)
{
cout << result[i];
}
cout << endl;
}
}
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2375&sca=2040
JUNGOL | 진법 변환 > 문제은행
A진법 수 N을 입력 받아 B진법 수로 출력하는 프로그램을 작성하시오. N에 사용되는 값은 0 ~ 9, A ~ Z이다. (2 <= A, B <= 36) ( 0<= N<= 263-1 ) 입력은 100개 이하의 테스트 케이스가 행으로 구분하여 주어진다. 테스트 케이스의 끝에는 0이 주어진다. 각 테스트 케이스에는 세 수 A, N, B가 공백으로 구분되어 주어진다. 각 테스트 케이스에 대하여 A진법수 N을 B진법 수로 변환한 결과를 행으로 구분하여 출력한다.
www.jungol.co.kr