강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

홍정모의 따라하며 배우는 C언어

9.9 이진수 변환 예제

print_binary_loop 함수를 구현해봤습니다.

작성

·

30

1

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

/*

10

10 / 2 = 5, remainder = 0

5 / 2 = 2, reminder = 1

2 / 2 = 1, reminder = 0

1 / 2 = 0, reminder = 1

*/

void print_binary(unsigned long n);

void print_binary_loop(unsigned long n);

int main()

{

unsigned long num = 10;

print_binary_loop(num);

printf("\n");

print_binary(num);

printf("\n");

return 0;

}

void print_binary(unsigned long n)

{

if (n > 0)

{

print_binary(n / 2);

printf("%d", n % 2);

}

}

void print_binary_loop(unsigned long n)

{

int i = 0, remain, v;

for (int ans = n; ans > 0; ans = ans / 2)

{

//printf("ans : %d\n", ans);

i++;

}

for (int j = 0; j < i; j++)

{

v = n;

for (int k = i; k > j; k--)

{

remain = v % 2;

v = v / 2;

}

printf("%d", remain);

}

}

답변 2

1

안녕하세요? 질문&답변 도우미 durams입니다.

print_binary_loop

강의 영상에서 나온 버전은 실제 순서와는 반대로 숫자가 출력된다는 작은 문제가 있었는데요, 이를 해결하려 시도하신 것으로 보입니다. 맨 앞 자리(MSB)부터 구하기 위해 여러번의 연산을 하고 있는데, 이 방식은 입력 정수 n의 길이가 길어질수록 나머지 연산과 나누기 연산의 횟수가 크게 증가하게 된다는 단점이 있겠죠.

강의 마지막에 소개된 것처럼 이후에 배우게 되실 배열을 이용하신다면 이 단점을 해결하실 수 있습니다.

print_binary

강의 영상의 버전은 n >= 2일 때만 재귀를 진행하지만, 질문자님의 코드는 n > 0일 때도 재귀 호출을 진행합니다. 인자 n이 0일 때에는 아무런 작업도 하지 않으니 의미없는 호출이라고 볼 수 있겠네요. 강의의 코드는 그러한 의미없는 호출을 없앤 버전이라고 보시면 될 것 같습니다. 물론 사용자 시점에서 출력되는 결과는 동일합니다.

0

안녕하세요, 인프런 AI 인턴입니다. wjdwn535님.

주어진 C 코드의 print_binary 함수는 재귀적으로 숫자를 2진수로 변환하여 출력합니다. 반면, print_binary_loop 함수는 반복문을 활용하여 동일한 작업을 수행하려 합니다.

하지만 현재 print_binary_loop 함수에서는 일부 로직이 제대로 구현되지 않아 출력이 예상과 다를 수 있습니다. 여기서는 기본적으로 숫자의 각 자리수의 이진수를 구하고 출력하는 방식으로 작동해야 합니다.

  1. print_binary 함수는 재귀를 사용하여 역순으로 나머지를 출력함으로써 숫자를 2진수로 바꾸는 방법을 채택하고 있습니다.

  2. print_binary_loop 함수 문제점 및 개선:

    • 주어진 반복문은 숫자의 각 자리 이진 숫자를 계산하려는 의도로 보입니다. 하지만 처음부터 나누는 작업을 통해 각 자리가 역순으로 출력되지 않습니다.
    • 이를 해결하려면 숫자를 오른쪽에서 왼쪽으로 읽어오면서 각각의 비트를 출력하는 방향으로 수정해야 합니다.

관련 질문이 다뤄진 유사한 답변을 참고하면 더 나은 이해에 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

질문하기