十进制数转换二进制的代码,可惜有错误,请众位指点。
程序代码:
/********************************************************************** ************* ************ ************* 程序写到这里,进行不下去了,现在主要是 ************ ************* 两个问题:1,输入的十进制数字不能大于int ************ ************* 的范围,否则无法完成转换;2,小数部分如果 ************ ************* 是只能取近似值的无限循环数时,无法判断并 ************ ************* 结束循环并取近似值,但现在的程序也怪了, ************ ************* 本来是无法结束的循环,莫名其妙就结束了,想 ************ ************* 了半天也不知道问题在哪?还望高手指点。 ************ ************* ************ ************* 其实也想到过用数组作为输入数,但实在是 ************ ************* 想不出算法来,也请高手作以指点。谢谢了。 ************ ************* ************ **********************************************************************/ #include<stdio.h> #include<string.h> #define N 1000 int main(void) { float a; char b[N]; int i=0,j,c,l=1; do { system("cls"); printf("请输入待转换的30000以内十进制数:\n"); scanf("%f",&a); if(a>30000) { printf("您的输入有误,请重新输入。"); sleep(1); } } while(a>30000); printf("\n二进制为:\n"); c=a; /* C是int 型,问题就出在这,主要是想取数值的整数部分。*/ if(!c) printf("0"); /* 如果C为0,直接输出0 */ if(c) { for(;c;c/=2) /*如果输入值非零,进入循环中*/ { if(c%2) b[i]='1'; /* 如果余2为真,在数组中存入1 */ else b[i]='0'; /* 如果没有余数,说明此位为 0 */ ++i; } for(j=i-1;j>=0;--j,++l) { printf("%c",b[j]); if(!(l%4)) printf(" "); /* 输出整数部分的二进制数 */ } } a-=(int)a; /* 取小数部分的值 */ l=1; if(a>0) /* 如果小数部分有值,就进入循环 */ { printf("."); /* 输出小数点 */ for(;a>0;a=a*2,++l) /* 循环的结束条件为 a 值小于或等于零 */ { a-=(int)a; /* 取小数部分值 */ if(!(a-(int)a)) /*~~~~~~~~~~~如果 a 值为零,跳出循环*/ break; if(a*2>=1) /*如果 a*2 大于等于1,此位二进制为 1 */ printf("1"); else printf("0"); /* 如果a*2不进位,此位为 0 */ if(!(l%4)) printf(" "); if(!(l%40)) puts(" ");/* 输出格式:四位一组,10组一行*/ } } puts(""); getch(); }
[[it] 本帖最后由 广陵绝唱 于 2008-5-13 19:38 编辑 [/it]]