본문 바로가기

백준

3460)이진수

https://www.acmicpc.net/problem/3460


십진수를 이진수로 만들고 최하위 비트의 자리가 0번일 때, 비트값이 1인 비트의 자리를 출력해야 한다.


십진수를 이진수로 바꾸기 위한 가장 쉬운 방법이 어떤 수를 2로 계속 나누어 그 나머지를 취하는 것이다.


가장 먼저 나누어 얻은 나머지는 최하위 비트이다.


이 순서대로 배열에 저장하면 거꾸로 이진수를 저장하는 셈이지만 


인덱스를 차례로 증가시켜 출력해 문제의 요구를 만족시키엔 적합하다.


우선 주어진 수가 몇 개의 비트로 표현될 수 있는지 갯수를 센다.


그 수만큼 배열을 할당한다.


주어진 수를 2로 나눈 나머지를 배열에 차례로 저장하고 마지막엔 몫을 저장한다.


배열에 접근하며 각 비트값이 1인 인덱스만 출력한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
 
int bitCount(int n) {
    int count = 0;
 
    while (n > 0) {
        n /= 2;
        count++;
    }
 
    return count;
}
 
void calBit(int *bits, int bitNum, int n) {
    int Q = n;
    int i;
    
    for (i = 0; i<bitNum-1;i++) {
        bits[i] = n % 2;
        Q = n;
        n /= 2;
    }
    bits[i] = Q;
}
 
int main() {
    int T, n;
    int bitNum;
    int *bits;
 
    scanf("%d",&T);
    for (int i = 0; i < T;i++) {
        scanf("%d",&n);
        bitNum = bitCount(n);
        bits = (int *)calloc(bitNum, sizeof(int));
        calBit(bits, bitNum, n);
 
        for (int j = 0; j < bitNum;j++) {
            if (bits[j]) printf("%d ",j);
        }
        printf("\n");
    }
    
    return 0;
}
cs


'백준' 카테고리의 다른 글

6376)e 계산  (0) 2019.02.02
4659)비밀번호 발음하기  (0) 2019.02.02
2799)블라인드  (0) 2019.01.31
2822)점수 계산  (0) 2019.01.31
5397)키로거  (0) 2019.01.31