c·c++/c 프로그래밍

진법 변환

바로이순간 2012. 6. 6. 08:32

#include <stdio.h>

int main() {

    // 정수 부분을 나타낼 변수로 n을 사용합니다.

    int i, j, n, sign2, sign10;

    // 2진법의 경우의 입력을 받을 변수입니다.

    char str2[100];

    double x, y, z;


    // 2진수의 입력입니다.

    printf("2진수 입력: ");

    scanf("%s", str2);


    // 2진수를 10진수로 바꿉니다.

    // 먼저 소수점의 위치를 구합니다. 모든 수에는 소수점이 있다고 가정합니다.

    j=0;

    if(str2[0]=='-') sign2=-1;

    else sign2=1;

     

    while(str2[j]!='.') j=j+1;


    n=0;   // 정수부분은 0으로 출발합니다.


    // 한자리가 더해질 때마다 이미 입력된 값들은 2배가 됩니다.

    if(str2[0]=='-' || str2[0]=='+') i=1;

    else i=0;

    while(i<j) { n=n+n+str2[i]-'0'; i=i+1; }

    // 이제 n은 정수 부분을 가지고 있습니다.


    // 소수부분을 구할 차례입니다.

    // 한자리씩 내려갈 때마다 0.5배씩 자리의 값이 바뀌게 됩니다.


    x=1.0;     // 각 자리의 값입니다. 1.0으로 출발합니다.

    y=0.0;      // 소수부분입니다.      0.0으로 출발합니다.


    // 소수점 다음 자리부터 출발해서 끝까지 갑니다.

    for(i=j+1;0<str2[i];++i) {


        // 자리의 값은 0.5배가 됩니다.

        x=0.5*x;


        // 각자리의 수가 자리의 값과 곱해져서 더해집니다.

        y=y+x*(double)(str2[i]-'0');

    }


    // 결과는 정수부와 소수부를 합친 것입니다.

    z=(double)n+y;

    // 부호를 곱해줍니다.

    z=sign2*z;


    // 10진수로 출력

    printf("10진수는: %f\n", z);


    // 10진수의 입력입니다.

    printf("10진수 입력: ");

    scanf("%lf", &x);


    // 부호부분입니다.

    if(x<0) { sign2=-1; x=-x; }

    else sign2=1;


    // 정수부부입니다.

    n=(int)x;

    // 소수점이하 부분입니다.

    x=x-(double)n;


    j=1;

    while(j<n) j=j+j;

    if(j>n) j=j/2;


    // 2진수의 부호출력입니다.

    if(sign2<0) printf("-");

    

    // 2진수의 정수부분 출력입니다.

    while(j>0) {

        if(j&n) printf("1"); else printf("0");

        j=j/2;

    }

    // 소수점 출력입니다.

    printf(".");

    // 소수점이하 부분 출력입니다.

    // 최대 10자리만 출력하였습니다.

    i=0;

    while(i<10 && x>0.0) {

        x=x+x;

        if(x>=1.0) {

            x=x-1.0;

            printf("1");

        }

        else printf("0");

        i=i+1;

    }


    return 0;

}