보관함

JUNGOL 실력키우기 수학2 - 이진수 | 10진수를 2, 8, 16진수로 | 진법 변환

niamdank 2020. 2. 5. 23:35

기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.

실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.

 

이번 포스팅에서는 수학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