AcWing 3435. 位操作练习
原题链接
简单
作者:
懒惰的蚩蚩
,
2024-03-25 17:01:49
,
所有人可见
,
阅读 6
#include<iostream>
using namespace std;
const int N = 16;
int state[N];
bool solve(int n, int m) {
//不相等的时候才进行循环左移
if(n != m) {
bool can = false;
//每次更新一下state确保不保留上次的state数据
for(int i = 0; i < 16; i++) state[i] = 0;
//将数字变成二进制并保存起来
int k = 0;
while(n) {
state[k++] = n & 1;
n >>= 1;
}
//一共尝试循环左移15次,15次没找到就是NO了
for(int op = 0; op < 15; op++) {
//循环左移一位
int tmp = state[0];
for(int i = 0; i < 15; i++) {
state[i] = state[i + 1];
}
state[15] = tmp;
//将循环左移之后的state转换为十进制数字
int res = 0, a = 1;
for(int i = 0; i < 16; i++) {
res += state[i] * a;
a *= 2;
}
//和指定数字比较,比较成功就跳出循环
if(m == res) {
can = true;
break;
}
}
return can;
}else {
return true;
}
}
int main() {
int n, m;
while(cin >> n >> m) {
if(solve(n, m)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}