数字谜题(number)

【题目描述】

小林最近迷上了数字谜题。在他的数学课上,老师介绍了不同进制之间的转换,特别是十进制和二进制之间的转换。老师提到,二进制是一种数字系统,它仅使用两个数字:0 和 1。在二进制系统中,每个位置的数值代表的是 2 的幂次方,从最右边开始,第一位是 2 的 0 次方,第二位是 2 的 1 次方,依此类推。每个位的值取决于它是 0 还是 1,并且整个数字的值是所有位的值的总和,例如,二进制 101 转换成十进制的值为 5 (即 1*(2^2)+0*(2^1)+1*( 2^0) )。在一次课堂上,老师提出了一个挑战性的数字谜题,给定一个十进制整数,将其转换为二进制表示,并在这个二进制序列中找出最长的连续 1 的个数。如 11101中最长的连续 1 个数为 3。现在小林希望编写一个程序,对于输入的任何数字都得到数字谜题的答案。

【输入格式】

第一行包含一个正整数 T,表示一共有 T 个数字谜题需要解决。

接下来 T 行,每行一个正整数 x,对于输入的每个数字谜题,都需要输出对

应的答案。

【输出格式】

输出 T 行,每行一个整数表示将 x 转换为二进制表示,并在这个二进制序列

中找出最长的连续 1 的个数。

【样例输入 1】

3
3
7
10

 

【样例输出 1】

2
3
1

【数据范围与约定】

对于 30%的数据,1≤x≤100,1≤T≤10。

对于 100%的数据,1≤x≤1e18,1≤T≤100000

题解:

#include <iostream>
using namespace std;

// 计算二进制表示中连续1的最大长度
int fac(long long x) {
    int ans = 0;
    int maxLen = 0;
    while (x > 0) {
        if (x & 1) {
            ans++;
            if (ans > maxLen) {
                maxLen = ans;
            }
        } else {
            ans = 0;
        }
        x >>= 1;
    }
    return maxLen;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        long long a;
        cin >> a;
        cout << fac(a) << endl;
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值