문제 : http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2080&sca=2040
문제
컴퓨터는 내부적으로 0과 1 두 개의 숫자만을 사용하여 모든 프로그램이 동작된다.
이렇게 두 개의 숫자만으로 이루어진 수를 이진수라 한다.
2진수를 입력받아 10진수로 변환하여 출력하는 프로그램을 작성하시오.
Hint!
10진수란?
어떤 수를 0부터 9까지 10개의 숫자로 나타내는 표시방법을 10진법이라 하고 이렇게 표시된 수를 10진수라 한다. 한자리에서 10개가 넘으면 묶어서 자리올림이 발생된다.
10진수 12345는 다음과 같이 식으로 표시할 수 있다.
12345 = 1*104 + 2 * 103 + 3 * 102 + 4*101 + 5 * 100 (모든 수의 0제곱은 1을 나타낸다.)
2진수란?
어떤 수를 0과 1 두개의 숫자로 나타내는 표시방법을 2진법이라 하고 이렇게 표시된 수를 2진수라 한다. 한자리에서 2개가 넘으면 묶어서 자리올림이 발생된다.
2진수 10101은 다음과 같이 식으로 표시할 수 있다.
10101 = 1*24 + 0 * 23 + 1 * 22 + 0*21 + 1 * 20
2진수를 10진수로 변환하기 위해서는 위와 같은 식을 이용해서 계산을 하면 된다.
위의 식을 정리하면 2진수 10101은 16 + 4 + 1 = 21이 되는 것이다.
위의 (10101)2 은 (1010)2 * 2 + 1과 같다. 이러한 성질을 재귀적으로 이용하면 앞에서부터 계속 2를 곱하면서 더해 나가는 방법으로 쉽게 프로그래밍을 할 수 있다.
10101을 변환하는 과정을 살펴보자.
• 처음에 맨 앞의 1을 10진수로 변환하면 1이다.
• 다음 앞에서 두자리(10)까지 변환하면 1*2+0 = 2이다.
• 다음 세자리(101)까지 변환하면 2*2+1=5이다.
• 다음 네자리(1010)까지 변환하면 5*2+0=10이다.
• 다음 다섯자리(10101)까지 변환하면 10*2+1=21이다.
10진수를 2진수로 변환하기
10진수를 2진수로 변환하기 위해서는 위의 과정을 역순으로 하여 2씩 묶어가면서 나머지를 1의 자리부터 확정해 나가면 된다. 10진수 21을 2진수로 변환하는과정은 다음과 같다.
#include <stdio.h>
#include <string.h>
int change(char t[])
{
int i, len, ten=0;
len = strlen(t);
for (i=0; i<len; i++)
{
ten = ten*2+(t[i]-'0'); //앞자리까지의 값에 2를 곱하고 현재의 값을 더한다.
}
return ten;
}
int main()
{
char two[35];
scanf("%s", two);
printf("%d\n", change(two));
return 0;
}
코드분석
change 함수는 문자열로 된 이진수를 받아서 10진수로 변환하여 리턴하는 함수이다.
t[i]는 문자 ‘0’ 또는 ‘1’이므로 숫자로 변환하기 위해서는 ‘0’을 빼주어야 한다.
참고로 change 함수는 재귀적 성질을 이용하여 아래와 같이 재귀함수로 작성할 수도 있다.
#include <stdio.h>
#include <string.h>
int change(char t[], int len)
{
if (len==0) return 0;
return change(t, len-1) * 2 + (t[len-1]-'0');
}
int main()
{
char two[35];
scanf("%s", two);
printf("%d\n", change(two, strlen(two)));
return 0;
}
정답 :
# include <stdio.h>
# include <string.h>
int main()
{
char arr[31];
int i,j,sum=0;
scanf("%s",arr);
for(i = strlen(arr)-1, j = 1; i>=0; i--,j*=2)
{
sum += j*(arr[i] - '0');
}
printf("%d",sum);
return 0;
}
최근댓글