간단한 문제인데요, 저는 요즘 공부하고 있는 STL함수들을 이용해 본다고 하다가 JUNGOL에서 컴파일이 안되는 바람에 상당히 틀렸네요.
또, HINT를 보니 깔끔하게 재귀적으로 처리할 수 있는 방법을 적어놔서 그것을 보고 재귀 버전을 만들어 봤습니다.
10진수를 2진수로 변환하기
10진수를 2진수로 변환하기 위해서는 2진수를 10진수로 변환하는 과정을 역순으로 하여 2씩 묶어가면서 나머지를 1의 자리부터 확정해 나가면 된다.
10진수 21을 2진수로 변환하는 과정은 다음과 같다.
코드1
#include <stdio.h>
int two[50];
int change(int n)
{
int i;
for(i=0;;i++) {
two[i]=n%2; // 뒤에서부터 i번째 자리의 값을 저장한다.
n/=2; // 2로 나눈 몫을 저장한다.
if(n==0) break; // 0이 남으면 종료한다.
}
return i;
}
int main()
{
int N, cnt, i;
scanf("%d", &N);
cnt = change(N); // 함수를 호출하여 이진수로 변환한 마지막 위치를 cnt에 저장한다.
for(i=cnt;i>=0;i--) { // two[0]이 1의 자리이므로 마지막 위치부터 출력한다.
printf("%d", two[i]);
}
return 0;
}
코드분석
change 함수는 10진수를 받아서 two배열의 앞에서부터 2진수로 변환한 값을 저장하고 저장된 마지막 위치를 리턴해 주는 함수이다.
two[0]번이 1의 자리이다. 1의 자리부터 구해지기 때문에 구해진 값을 배열에 저장을 했다가 n이 0이 되어야 출력을 할 수가 있다.
만약 아래와 같이 재귀함수를 사용하면 함수 내에서 재귀적으로 함수를 호출하고 나서 현재의 값을 출력하면 되므로 보다 간단하게
프로그램을 작성할 수 있다.
#include <stdio.h>
void change(int n)
{
if (n==0) return; // 0이면 처리할 것이 없으므로 리턴한다.
change(n/2); // 앞자리까지의 결과를 호출하여 처리한다.
printf("%d", n%2); // 현재의 위치에 해당하는 값을 출력한다.
}
int main()
{
int N;
scanf("%d", &N);
change(N);
return 0;
}