题目描述
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
输入: 一个byte型的数字
输出: 无
返回: 对应的二进制数字中1的最大连续数
输入描述:
输入一个byte数字
输出描述:
输出转成二进制之后连续1的个数
示例1
输入
3
输出
2
#include <stdio.h>
/*
各进制间转换方法:
https://blog.nowcoder.net/n/66e2146dd79e4be4a164d467b1ae50ac
转为2进制字符串:除2取余,只需统计1,
故不需要转为实际的二进制数,只需得到所有01字符,
在转换过程中就可以直接完成统计
若余数为1,则开始统计1的个数,若遇到0,则与当前最大的连续1个数进行比较,
存储最大值,然后继续取余,直至商为0对应的余数
调试用例:3,5,0(考试模式下只能自测发现问题,所以要取各种用例来自测,可借助打印count来观察程序运行过程,发现漏或者与预期不符的地方)
另一个回答:
链接:https://www.nowcoder.com/questionTerminal/4b1658fd8ffb4217bc3b7e85a38cfaf2?f=discussion
来源:牛客网
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
while(cin>>a)
{
int sum=0,max=0;
while(a){
if(a%2){
sum++;
if(sum>max) max=sum;
}
else sum=0;
a=a/2;
}
cout<<max<<endl;
}
return 0;
}
*/
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
int max=0;
int count=0;
int flag = 0;
int inte=n;
int r;
while(1){
r = inte%2;
if(r==1){
flag = 1;
count++;
}else if(r==0 && flag==1){
if(count>max){
max = count;
}
flag = 0;
count = 0; // !!注意此处计数要清0,到此处1已经不连续了,需要重新开始统计下一轮
}
// printf("count=%d\n",count);
if(inte == 0){
// 多处理一次取余,使其遇到r=0,防止全1的二进制数(如3)导致的max没有赋值
// 如1/2=0...1,在得到商inte为0前,已经处理了r=1;此时由于inte还未进行/2赋值操作,
// 所以inte还为1,不退出循环,然后/2使inte=0;当进到下一轮时,r=0,然后判断得inte=0,结束循环
break;
}
inte = inte/2;
}
printf("%d\n",max);
}
return 0;
}


京公网安备 11010502036488号