题目描述
功能: 求一个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; }