首页 > 试题广场 >

求最大连续bit数

[编程题]求最大连续bit数
  • 热度指数:149589 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的十进制整数 n,求解其二进制表示中,最长连续 1 段的长度。

输入描述:
\hspace{15pt}输入一个十进制整数 n \left(1 \leqq n \leqq 5 \times 10^5\right)


输出描述:
\hspace{15pt}输出一个整数,表示 n 的二进制表示中,最长连续 1 段的长度。
示例1

输入

200

输出

2

说明

\hspace{15pt}在这个样例中,十进制 (200)_{10} 等于二进制 (11\,001\,000)_{2},其中最长连续 1 段的长度为 2
示例2

输入

1023

输出

10

说明

\hspace{15pt}在这个样例中,十进制 (1023)_{10} 等于二进制 (1\,111\,111\,111)_{2}

备注:
\hspace{15pt}本题数据已规范为单组询问(2025/01/15)。
//
#include <stdio.h>
#include <string.h>
int main() {
    /*  //解法一,求数字的二进制写法有多少个连续的1
        int num = 0;
        int max = 0; // max length
        int length = 0;
        int temp[100];
        int m = 1;
        while (scanf("%d", &num) != EOF) {
            max = 0;
            length = 0;
            m = 1;
            for (int i = 0; i < 32; i++) {
                if (num & m) {
                    length++;
                } else {
                    if (max < length) {
                        max = length;
                    }
                    length = 0;
                }
                m = m << 1;
            }

            if (max < length) {
                max = length;
                length = 0;
            }
            printf("%d", max);
        }
    */

    /* 解法二,求数字的二进制写法有多少个连续的1*/
    int num = 0, count = 0, total = 0, len = 0, i = 0;
    char out[32];
    while (scanf("%d", &num) != EOF) {
        len =0;     //重置
        count = 0;  //重置
        total = 0;  //重置
        memset(out, '0', sizeof(out));  //重置

        while (num) { //取每一位写入数组
            out[len++] = '0' + (num & 0x1);
            num = num >> 1;
        }

        //累计连续的1的个数,遇到1递增,遇到0重置为0
        for (int j = 0; j < len; j++) {
            if (out[j] == '1') {
                count++;
                if (count > total)
                    total = count;
            } else {
                count = 0;
            }
        }
    }
    printf("%d", total);
    return 0;
}


发表于 2024-11-29 15:33:11 回复(0)
#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int count = 0, max = 0;
        while (n) {
            if (n % 2 != 0) {
                count++;
            } else if (n % 2 == 0) {
                count = 0;
            }
            if (count > max) {
                max = count;
            }
            n = n / 2;
        }
        printf("%d\n", max);
    }
    return 0;
}

发表于 2024-09-13 09:31:02 回复(0)
#include <stdio.h>
void count_one(unsigned value) {
    int ones = 0, max = 0;
    while (value != 0) {
        if ((value & 1) != 0) {
            ones++;
            if (max < ones)
                max = ones;
        } else {
            ones = 0;
        }
        value >>= 1;
    }
    printf("%d", max);
}
int main() {
    int a;
    while (scanf("%d", &a) != EOF)
        count_one(a);
    return 0;
}
发表于 2024-08-24 15:22:34 回复(0)
//硬算
#include <stdio.h>
int main() {
    int num=0;
    scanf("%d", &num);
    int max=0;
    while(1){
        if(num==0){
            break;
        }
        int count=0;
        if(num%2==1){
            while(num%2==1&&num>0){
                count++;
                num/=2;
            }
        }
        num/=2;
        if(max<count){
            max=count;
        }
    }
    printf("%d", max);
    return 0;
}

发表于 2024-08-19 16:19:14 回复(0)
#include <stdio.h>

int main() {
    unsigned int a,count = 0,temp = 0;
    scanf("%d",&a);
    if(a > 500000)return -1;
    for(int i = 0; i < 20; i++){
        if((a & 1) != 0){
            temp++;  
        }else{
            if(temp > count){
                count = temp;
            }
            temp = 0;
        }
        a = a >> 1;
    }
    printf("%d",count);
    return 0;
}
发表于 2024-03-22 17:11:42 回复(0)
#include <stdio.h>
int main() {
    int n, sum = 0, min = 0;
    scanf("%d",&n);
    while(n>0){
        if((n&1)==1) min = min>++sum?min:sum;
        else sum = 0;
        n = n>>1;
    }
    printf("%d",min);
    return 0;
}

发表于 2023-12-03 23:06:24 回复(0)
#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int flag = 0;
        int ret = 0;
        int tmp = 0;
        for(int i = 0;i<31;i++)
        {
            if(n&1 == 1)
            {
                if(flag == 0)
                {
                    flag = 1;
                }
                tmp++;
                n >>= 1;
            }
            else
            {
                ret = ret>tmp?ret:tmp;
                tmp = 0;
                flag = 0;
                n >>= 1;
            }
        }
        printf("%d\n",ret);
    }
    return 0;
}
发表于 2023-10-13 22:42:55 回复(0)
#include <stdio.h>
#include <string.h>

int main(){
    int n,len,i;
    int k=0;
    int a[20],b[20];
    scanf("%d",&n);
    while(n/2)
    {
        a[len++]=n%2;n=n/2;
    }
    a[len++]=n%2;
    for(i=0;i<len;i++)
    {
        while(a[i]==1)
        {
            k++;
            i++;    
        }
        b[k-1]=k;
        k=0;
    }
    for(i=0;i<len;i++)
    {
        if(b[i]!=i+1)
        {
            b[i]=0;
        }
    }
    for(i=0;i<len;i++)
    {
        if(b[0]<b[i])
        {
            k=b[0];
            b[0]=b[i];
            b[i]=k;
        }
    }
    printf("%d",b[0]);
    return 0;
}
我这个程序在自己的编译器里输入14,输出3是正确的,但是到了提交时候说实际输出4,不知道为什么
发表于 2023-03-18 22:28:47 回复(0)
#include <stdio.h>

int main() {
    int t,n;
    //scanf("%d",&t);
    //while(t--){
        int count=0;
        int tmp=0;
        scanf("%d",&n);
        while(n){
            if(n&0x01){
                tmp++;
            }
            else{
                tmp=0;
            }
            if(tmp>count) count=tmp;
            n=n>>1;
        }
        printf("%d\n",count);
    //}
    return 0;
}

所以题目给的数据组数是什么意思呢?本来还以为需要格式控制,结果发现没有格式控制。
发表于 2023-01-01 16:00:11 回复(0)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int n,max,tmp;
    while(scanf("%d",&n)!=EOF)
    {
        tmp = 0;
        max = 0;
        while(n>0)
        {
            if(n&0x01 == 0x01)
            {
                tmp++;
            }
            else
            {
                tmp = 0;
            }
            n >>=1;
            max = (max > tmp)?max:tmp;
        }
        printf("%d\n",max);
    }
    return 0;
}

发表于 2022-06-19 08:59:34 回复(0)
#include <stdio.h>
int main()
{
    int arr[5],num,cnt,i,j=0;
    while(scanf("%d",&num)!=EOF)
    {
        cnt=0;i=0;
        while(num>0)
        {
            if(num&0x01)
                i++;
            else
            {
                if(cnt<i)
                    cnt=i;
                i=0;
            }
            num>>=1;
        }
        if(i>cnt)
            cnt=i;
        arr[j++]=cnt;
    }
    for(i=0;i<j;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

发表于 2022-04-25 09:31:20 回复(0)
2进制转换,除2取余,逆序排列。
#include<stdio.h>
int main(){
    int n;
    while(~scanf("%d",&n)){
        int max=1;  //假设当前最大连续为1
        for(int seq=0;n>0;n/=2){
            if(n%2!=0){
                seq++;  //连续进行累加
                if(seq>max) max=seq;  //如果超过就修改当前最大连续数
            }
            else seq=0;  //断连就重置计数
        }printf("%d\n",max);
    }
}


发表于 2022-03-31 02:15:26 回复(0)
求助预测输出中2和1啥意思
发表于 2022-03-13 00:52:25 回复(0)
#include<stdio.h>
int main()
{
    int in;
    while(scanf("%d", &in) != EOF)
    {
        int count = 0;
        int max = 0;
        while(in != 0)
        {
            if(in & 1 == 1)
                count ++;
            else
                count = 0;
            max = (max > count) ? max : count;
            in = in >> 1;
        }
        printf("%d\n", max);
    }
    return 0;
}


发表于 2021-12-12 21:40:25 回复(0)
#include <stdio.h>

int main()
{
    int input;
    int num,max;
    while(scanf("%d",&input)!=EOF)
    {
        num=0;
        max=0;
        while(input)
        {
            if(input%2==1)
                num++;
            else
                num=0;
            max=max>num?max:num;
            input=input/2;
        }
        printf("%d\n",max);
    }
    return 0;
}
循环除2,%2余1则计数+1,%2余0则计数归零,最后保存计数最大值。

发表于 2021-12-10 21:53:52 回复(0)
#include <stdio.h>

int main()
{
    int num = 0;
    while(scanf("%d",&num) != EOF)
    {
        int width = 0 ,Ret = 0;
        int tmp = 0;
        while(num)
        {
            tmp = num%2;
            if(1 == tmp) width++;
            else
            {
                if(width > Ret) Ret = width;
                width = 0;
            }
            num = num/2;
        }
        if(width > Ret) Ret = width;
        printf("%d\n",Ret);
    }
    return 0;
}

发表于 2021-09-03 15:42:44 回复(0)

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{
int num;
int flag;
int max;
int temp[16] = { 0 };
while (scanf("%d", &num) != EOF)
{
flag = 0;
max = 0;
if ((num >= 0) && (num <= 255))
{
max = 0;
int dp[16] = { 0 };
for (int i = 0; i<16; i++)
{
if((num >> i) & 0x01)
{
max = max + 1;
dp[max] = max;
}
else
{
max = 0;
}
}
//查找连续的1
for (int i = 15; i >= 0; i--)
{
if (dp[i] == i)
{
printf("%d\n", dp[i]);
break;
}
}
}
}

return 0;

}

发表于 2021-08-31 15:51:48 回复(0)
使用位运算,向右减少,低位为1则表示除2余1
#include<stdio.h>
int main(){
    int in;
    while(scanf("%d",&in)!=EOF){
        int count=0;
        int max=0;
        do{
            if(in%2==1){
                count++;
                max=max>count?max:count;
            }else{
                count=0;
            }
        }while((in=in>>1)>0);
        printf("%d\n",max);
    }
}
发表于 2021-08-06 19:30:29 回复(0)

问题信息

难度:
18条回答 29468浏览

热门推荐

通过挑战的用户

查看代码
求最大连续bit数