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 |