c语言小白,请问为什么我的这段代码输出结果不正确?应该怎么改呢?求具体分析我的代码,谢谢您!

Num[ ]是用来储存连续1的个数的,num是计算一共有多少个1,当遇到0的时候就在Num[ ]里面写入一个数,最后找出Num中最大的那个就是最长连续1的个数,请问问题出在哪里呢?

你的算法问题有两点:

1、

这一块统计数量的代码其实老实说我都没看懂是什么意思,但是我测试了,输入13能统计出来是2,但是输入12345的时候统计就错了,这段并不能数出3来。

2、

第17行有问题,你每次循环都把max赋值为Num[0],按照你的代码来,输入13时,Num[0]的值为0,所以max初始值总是0,而且Num[9]也是0,所以循环到最后一次的时候,整个过程是:

max=Num[0];=>max->0

if(Num[9]>max)=>Num[9]->0,max->0,结果为false

循环结束,返回max=>返回0

所以你输入13的时候输出结果为0。


针对这两点我做出如下改动:

1、大改了统计个数的代码块,修改为:

思想:当arr[i]为1时,计num为1,循环遍历当前元素之后的元素arr[i+1],如果arr[i+1]也是1,则计数num+1,i也+1,再次while循环,此时就是相当于看arr[i+1+1],如果还是1,则再重复前面的步骤,直到出现0为止。出现0后,while循环结束,把本次统计得到的num存到Num[]数组中,p++。最终整个for循环结束后,就能得到计数数组Num[]了。


2、删除你的第17行,max初始值赋为:


整体代码修改为:

运行结果:


具体代码为:

#include<stdio.h>

int main(){

int x;

scanf("%d",&x);

int arr[32],num=0,i,p=0;

int Num[10]={0},max=0;

for(i=31;i>=0;i--){

arr[31-i]=(((x>>i)&1u)?1:0);

}

for(i=0;i<32;i++){

   if(arr[i]==1){

           num=1;

       while(arr[i+1]==1){

        num++;

        i++;

    }

   Num[p]=num; 

   p++; 

        }

    }

for(i=0;i<10;i++){

if(Num[i]>max){

max=Num[i];

}

}

printf("%d\n",max);

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-24
在for(i=0;i<32;i++)这个for语句里面有很多问题,比如你输入13即0x0000000d,从第4位开始后面全是0,你会进入else里面的语句,那么p=p+1,这里没什么,但Num[p]就会数组越界。
可以这样for(i=0;i<32;i++){if(arr[i]==1)num++; else{if(num!=0){num[p++]=num;num=0;}}}
在这里补充一点,一个32位的int变量,1010这样子间隔的话,你也得把Num这个数组至少留16个空间。
还有你获取最大值啊,max=Num[0];这语句放在for里面干嘛,Num[0]=0,这是导致你结果为0的原因,这条语句要放在for语句的上面嘛
另外主函数里改成unsigned int x较为稳妥
第2个回答  2019-10-23
首先,你的证词是错的。它应该是:scanf(%LF),&;a,&;b),正确的格式是:scanf(\"<格式化字符串>\",<地址表>);您的printf语句应为:printf(\"得到%f+%f=%fn\",a,b,a+b);,正确的格式是:printf(“输出格式类型”,变量),以前输出格式类型的数目,与变量的数目相同追问

什么是证词?看不懂你写的啥?好像和我的这道题没什么关系呀

本回答被网友采纳
相似回答