题目的主要信息:
求int类型数字对应的二进制数字中最多有多少个连续的1。
方法一:
用count统计连续的1的个数,maxlen表示最大连续的个数。十进制数字除2取余,然后向右移动一位。余数如果是1则count++,比较当前count和maxlen的大小,更新maxlen的值;否则需要重新开始计数,count清零。
具体做法:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
int n;
while(cin>>n){
int maxlen=0,count=0;
while(n!=0){
if(n%2==1) {
count++;//连续的1个数加1
if(count>maxlen){
maxlen = count;
}
}else{//重新开始计算连续的1的个数
count=0;
}
n=n/2;//整个数字串向右移动一位
}
cout<<maxlen<<endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,二进制数总共有位,每一位需要判断是否为1。
- 空间复杂度:,只用了常数空间。
方法二:
数n和左移一位的数n<<1进行位与运算:
- 若有k位连续的1,相与之后不为0;
- 若没有连续的1,相与之后位0;
当n经过多次运算变为0后,表示统计结束。
具体做法:
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int count=0;
while(n!=0){//当n不为0时
count++;
n=n&(n<<1);//n与位移的n相与
}
cout<<count<<endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,最坏情况下,所有位都为1,可以向左移动位。
- 空间复杂度:,只用了常数空间。