你的算法问题有两点:
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
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);
}
在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较为稳妥
首先,你的证词是错的。它应该是:scanf(%LF),&;a,&;b),正确的格式是:scanf(\"<格式化字符串>\",<地址表>);您的printf语句应为:printf(\"得到%f+%f=%fn\",a,b,a+b);,正确的格式是:printf(“输出格式类型”,变量),以前输出格式类型的数目,与变量的数目相同