#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;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
scanf_s 의 사용법 (0) | 2012.06.09 |
---|---|
중위표현을 후위표현으로 (0) | 2012.06.07 |
멱집합 (부분집합이 원소인 집합) 출력하기 (0) | 2012.06.03 |
엔터를 누르지 않고 입력을 받고 실행하기 (0) | 2012.06.03 |
대문자 소문자 숫자세기 (0) | 2012.06.02 |