www.acmicpc.net/problem/1373
1373번: 2진수 8진수
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
www.acmicpc.net
문제
2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cin >> str;
if (str.size()%3 == 1) {
cout << str[0];
}
if (str.size()%3 == 2) {
cout << (str[0]-'0')*2 + (str[1]-'0');
}
for (int i=str.size()%3; i<str.size(); i+=3) {
cout << (str[i]-'0')*4 + (str[i+1]-'0')*2 + (str[i+2]-'0');
}
return 0;
}
|
cs |
풀이
2진수가 주어졌을 때 8진수로 변환하는 방법은 뒤에서부터 3글자씩 잘라서 각 글자에 4,2,1을 곱해서 더해주면 된다. 101111 이 주어졌다면 3글자씩 잘라서 101 , 111로 만든뒤 (1 * 4) + (0 * 2) + (1 * 1) , (1 * 4) + (1 * 2) + (1 * 1) = 57이 된다.
3으로 나눠떨어지지 않는 글자 수의 2진수가 주어진다면 (ex 1100101 -7글자) 3으로 나눠떨어질 수 있도록 앞에 0을 붙여서 3으로 나눠준다 (1,100,101 -> 001,100,101 ) 그 후에 각각 4,2,1을 곱해서 더해준다. 이를 수행하기 위해서 입력받은 2진수의 글자 수를 3으로 나눠서 1이 남는다면 (7행) 입력받은 이진수의 첫 글자를 출력해준다. (1을 곱해서 출력하는 것은 그냥 출력하는 것과 같기 때문) 3으로 나눠서 2가 남는다면 (10행) 입력받은 이진수의 첫 글자에 2를 곱하고 두 번째 글자와 더해서 출력해준다. (3으로 나눠서 2가 남는다는 말은 3글자씩 잘랐을 때 앞에 2글자가 남는다는 말이고 0 하나를 붙여서 4,2,1을 곱해서 더해야 하는데 0 * 4 = 0 이기 때문에 첫 번째 수 * 2 + 두 번째 수를 출력해준다. )
그 후에 3글자씩 잘라서 각각 4,2,1을 곱한 뒤 더해서 출력해준다. (13~14행)