十进制数转换二进制的代码,可惜有错误,请众位指点。
程序代码:
/**********************************************************************
************* ************
************* 程序写到这里,进行不下去了,现在主要是 ************
************* 两个问题: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]]







