-
JUNGOL 실력키우기 수학2 - 이진수 | 10진수를 2, 8, 16진수로 | 진법 변환보관함 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