c语言问题为啥没错误却运行结果与预计不相符

/********程序功能*********/
/********输入某十进制整数,将其转换为二进制数并输出在屏幕上*********/
#include "stdio.h"
main()
{
int k=0;
int x, r,b[99],d[99],p,q;
int m,n,j;
int c[99],i,s;
printf("please input a single number:\n");
scanf("%d",&x);
do
{
r=x%2;
b[k++]=r;
x/=2;
}while(x);
p=0;
q=k-1;
for(;p<k;p++,q--)
d[q]=b[p];
for(p=0;p<k;p++)
b[p]=d[p];

m=k%4;
n=4-m;
j=k+n;
for(i=0;i<n;i++)
c[i]=0;
for(s=0;i<j;i++,s++)
c[i]=b[s];
for(i=0;i<j;i++)
{if((i+1)%4==0)
printf("\b");
printf("%c",c[i]);}
printf("\n");
}

  其实,十进制整数转二进制最简单的办法我觉得是利用移位操作,和按位与,因为数据在计算机里是二进制的形式。当然,如果是大数的问题就不好这样做,我觉得还是写个通用的函数方便点,然后递归,迭代,都可以。看你的输入应该不是大数。
  然后,看你复杂的for循环处理我看了半天感觉是想要处理输出格式。话说,你的代码我已经无力吐槽了。
  例如:
  for( ; p < k; p++, q--)
  d[q]=b[p];
  for( p = 0; p < k; p++)
  b[p]=d[p];
  这一段我想,你是要把顺序倒回来。
  这里你可以用
  for(i= 0; i < k / 2; i++ )
  {
  temp = b[i];
  b[i] = b[ k - i - 1];
  b[k - i - 1] = temp;
  }
  这样子看的懂点。
  然后
  m=k%4;
  n=4-m;
  j=k+n;
  这一段你应该是想要取4的整倍数这样写也是没问题的
  不过,要是我的话,会这样写 ceil(n / 4.0) * 4,用数学函数库里的取上底函数。
  还有就是这一段了:
  for(i=0;i<j;i++) // 这里我觉得既然要利用数组c输出,那么还是从0到j置零的好。
  c[i]=0;

  i = 0; // 这里你 i没有重新赋值,倒置下面for循环出问题了。
  for(s=0;i<j;i++,s++)
  c[i]=b[s];
  for(i=0;i<j;i++)
  {
  if( i && i % 4 == 0 ) // 四个一组。
  printf("\t"); //你确定你这里要的不是\t而是 \b?
  printf("%d",c[i]);// 最后这里看你的题目应该是%d输出,而不是%c
  }
  以下是完整代码:
  #include "stdio.h"
  #include <math.h>
  int main()
  {
  int k=0;
  int x, r,b[99],d[99],p,q;
  int m,n,j;
  int c[99],i,s;
  printf("please input a single number:\n");
  scanf("%d",&x);
  do
  {
  r=x%2;
  b[k++]=r;
  x/=2;
  }while(x);
  p=0;
  q=k-1;
  int temp;
  for(i= 0; i < k / 2; i++ )
  {
  temp = b[i];
  b[i] = b[ k - i - 1];
  b[k - i - 1] = temp;
  }
  j = ceil( k / 4.0) * 4;

  for(i=0;i<j;i++)
  c[i]=0;

  i = 0;
  for(s=0;i<j;i++,s++)
  c[i]=b[s];
  for(i=0;i<j;i++)
  {
  if( i && i % 4 == 0 )
  printf("\t");
  printf("%d",c[i]);
  }
  printf("\n");
}
附上一段代码
#include "stdio.h"
#include <math.h>
int main()
{
int k;
const int bit = 31; // 假设四个字节。
printf("please input a single number:\n");
while( scanf("%d",&k) )
{
int i = 0;
do
{
printf("%d",(k & 0x80000000) >> bit); // 从高位开始输出。
i++;
if( i % 8 == 0 )
{
printf(" "); //格式控制。
}
k <<= 1;
}while( i != 32 );
putchar('\n');
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-24
何必如此麻烦,十几行代码就能解决的事情
# include <stdio.h>
main()
{
int k=0, x, b[99]={0};
printf("Please enter a number:\n");
scanf("%d",&x);
if (x == 0) //如果x==0,后面将不会有输出,所以先输出一个0
printf("0");
for(; x; x/=2,k++) //b[0]是二进制右起第一位,b[1]是第二位,以此类推
if(x%2) b[k]=1; //如果x%2==1,二进制的右起第k+1位变成1
for(k--; k>=0; k--) //在第一个k--之前,k是二进制数的位数,先减1才能正确输出
printf("%d", b[k]); //将二进制数的每一位输出
printf("\n");
}
在VC++6.0中运行,结果完全正确。

希望对你有帮助!追问

对是对了,但我想要的输出形式是每4个二进制位中间用空格隔开高位不足补零。总之还是谢谢你

追答

你那样也简单,在第二个for循环之前算出 k%4,然后相应地补0。中间空格隔开的问题,在第二个for循环内加上检测k%4是否等于0,如果等于则输出一个空格即可。代码很简单,自己写吧。

参考资料:自己写的

第2个回答  2012-09-21
for(;p<k;p++,q--)
d[q]=b[p];
for(p=0;p<k;p++)
b[p]=d[p];
//这样的代码,真的能把人弄晕 ,你不适当加点注释,都不知道有些语句的目的是什么本回答被网友采纳
第3个回答  2012-09-23
楼上说的是

c语言问题为啥没错误却运行结果与预计不相符
其实,十进制整数转二进制最简单的办法我觉得是利用移位操作,和按位与,因为数据在计算机里是二进制的形式。当然,如果是大数的问题就不好这样做,我觉得还是写个通用的函数方便点,然后递归,迭代,都可以。看你的输入应该不是大数。然后,看你复杂的for循环处理我看了半天感觉是想要处理输出格式。话说...

我的c语言程序没有报错为什么会执行不了?
在C语言中,程序没有报错并不意味着程序一定是正确的。有时候,程序可能会出现逻辑错误或者运行时错误,导致程序无法执行或者输出不符合预期。以下是一些常见的导致程序无法执行的原因:1. 程序陷入死循环:程序在某个地方出现了死循环,使得程序无法继续向下执行。如果程序似乎无法结束,可以检查程序是否存在...

用C语言编程程序没有错误为什么结果不对
没发现他的错误而已,而既然运行结果是错误的,那就是说明一点 可能是你的算法设计的不当,不能正确的解决问题,这样发生的错误 是运行期错误,在编译连接的过程不会出错的,不过幸好,编译器也为我们 提供了一些解决类似运行期错误的一些调试工具,通过debug,进行单步调 试下,观察变量值,看看是不是你想要的...

为什么 程序 编译通过 也是正确的 但是运行的结果却不是正确的 我用...
没语法错误,有逻辑错误,特别是指针容易用错。

为什么我写的c语言在编译后没错误,没警告,但是运行时却没结果。
楼主,你好!编译没有错误只能说明没有语法错误,并不能说明代码的逻辑没有错!因为编辑器主要是根据C语言的语法来检查你的代码有没有错!

c语言没有显示出错,为什么运行结果不正确呢?求高手解答
首先,读入字符串的方法是 scanf("%s",a);其次,字符串不能用==来比较,需要用strcmp(a,"yes")== 0来判断 再次,字符串不可能既等于 "or"又等于 "yes or no"的

为什么编写的c语言程序运行出来的结果都不符合实际的运算啊?
scanf("%d,%d,&a,&b");这句有语义错误,语法上没有错误 运行完这句以后,实际还是没有给a和b赋值,a和b的值是未知的,然后计算sum=a+b;的时候,用的值是a和b的地址里面之前有的值 scanf("%d%d",&a,&b)这么写就可以了 输入 15 20 如果写成scanf("%d,%d",&a,&b)那么就要输入15,...

C语言代码没有编译没有错误,但在运行程序看结果,结果却显示不全
输出性别那行的 格式 应当用 %c 。你用了 %s, 因 printf() 找不到 '\\0', 输出流就乱了。

为什么c语言运行结果对但是又显示有错
请把错误信息发上来啊。结果对说明你的计算过程是对的,但程序报错,很可能是语句使用格式不正确,但不影响计算。并不是所有错误都会中止计算

c语言程序显示没有问题但运行结果是空白的?
您好,很高兴回答您的问题。在c语言中,程序的错误分成两种,一种是语法错误,程序在进行运行过程中会检测出来,并且给出错误的大致位置和原因,另一种错误是逻辑错误,说通俗点就是程序没有语法错误,但是程序内部出现了不符合题目本意的错误,导致不能得出正确结果,这种误是没有提示的,要编写者自己去...

相似回答
大家正在搜