인프런 커뮤니티 질문&답변
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 함수에서는 일부 로직이 제대로 구현되지 않아 출력이 예상과 다를 수 있습니다. 여기서는 기본적으로 숫자의 각 자리수의 이진수를 구하고 출력하는 방식으로 작동해야 합니다.
print_binary함수는 재귀를 사용하여 역순으로 나머지를 출력함으로써 숫자를 2진수로 바꾸는 방법을 채택하고 있습니다.print_binary_loop함수 문제점 및 개선:- 주어진 반복문은 숫자의 각 자리 이진 숫자를 계산하려는 의도로 보입니다. 하지만 처음부터 나누는 작업을 통해 각 자리가 역순으로 출력되지 않습니다.
- 이를 해결하려면 숫자를 오른쪽에서 왼쪽으로 읽어오면서 각각의 비트를 출력하는 방향으로 수정해야 합니다.
- 주어진 반복문은 숫자의 각 자리 이진 숫자를 계산하려는 의도로 보입니다. 하지만 처음부터 나누는 작업을 통해 각 자리가 역순으로 출력되지 않습니다.
관련 질문이 다뤄진 유사한 답변을 참고하면 더 나은 이해에 도움이 될 것입니다:
- 와일문 대괄호 질문합니다 - 와일문을 활용하여 반복문 내 조건이나 동작을 이해하는 방식에 대한 설명.
- a++ 설명법 - 후위 연산자의 사용 방식 및 그 이외 예제.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





