이진수 > 문제은행



2814 : 이진수

제한시간
1000 ms   
메모리제한
128 MB   
해결횟수
1391 회   
시도횟수
2578 회   

문제

컴퓨터는 내부적으로 0과 1 두 개의 숫자만을 사용하여 모든 프로그램이 동작된다.
이렇게 두 개의 숫자만으로 이루어진 수를 이진수라 한다.
2진수를 입력받아 10진수로 변환하여 출력하는 프로그램을 작성하시오.


입력형식

0과 1로만 이루어져 있는 30자리 이하의 2진수를 입력받는다.

출력형식

입력된 2진수를 10진수로 변환하여 출력한다.

입력 예

10101

출력 예

21

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 * 2

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진수로 변환하는과정은 다음과 같다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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;
}
cs

 

 

코드분석 

change 함수는 문자열로 된 이진수를 받아서 10진수로 변환하여 리턴하는 함수이다. 

t[i]는 문자 ‘0’ 또는 ‘1’이므로 숫자로 변환하기 위해서는 ‘0’을 빼주어야 한다.

참고로 change 함수는 재귀적 성질을 이용하여 아래와 같이 재귀함수로 작성할 수도 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
int change(char t[], int len)
{
    if (len==0return 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;
}
 
cs

 



출처

jungol

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호

TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com

Copyrightⓒ 2010-2019 jungol. All right reserved.

TOP