蓝桥杯练习题A

题目来源:http://oj.mofriend.net/problem.php?cid=1203&pid=0

题目描述
一个数是稀疏数,即这个数的二进制表示中没有相邻的 1。给出一个 n ,找出大于或等于 n 的最小的稀疏数。 例如:5(二进制表示为 101)是稀疏数,但是 6 (二进制表示为 110 )不是稀疏数
输入

输入数据有多行,每行输入一个整数 n
输出
输出数据有多行,每一行输出对应的大于或等于 n 的最小的稀疏数。(结尾加一个换行符)

1
2
3
4
样例输入
6 4 38
样例输出
8 4 40

思路:
位与循环 如果与的结果为1 flag++ 结果为0判断 flag=flag ==1?0:flag 最后结果判断flag 是否大于0就可以知道是否出现2个1 连续的.
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
bool isShuxi(int n) {
int c = 1;
int flag = 0;
for (size_t i = 0; i < 32; i++)
{
if ((c&n)!=0) {
flag++;
}else{
if (flag == 1) {
flag = 0;
}
}
c = c << 1;
}
return (flag > 1);
}
int main()
{
int n;
while (cin >> n) {
while (isShuxi(n)) {
n++;
}
cout <<n<<endl;
}
return 0;
}