题目简介:
给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。 循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如: 1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110
输入描述:
输出描述:
1
| 对于每一行的两个整数,输出一行,内容为YES或NO
|
输入
1 2 3 4
| 2 4 9 18 45057 49158 7 12
|
输出
思路:
这题的重点就是掌握循环左移的方法,即a = (a << 1) | (a >> 15)
为循环左移一位。(16位二进制的情况下)
tip:
- 由于题目要求是16位,且是正整数,所以需要使用
unsigned short
代码如下:
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 30 31 32 33 34 35 36 37
| #include <iostream> #include <string> #include <vector> #include <algorithm> #include <unordered_map> #include <cmath> #include <iomanip> #include <set> #include <map>
using namespace std;
int main() { unsigned short a, b;
while (cin >> a >> b) {
int n = 0; while (n < 16) { if (a == b) {
cout << "YES" << endl; break; }
a = (a << 1) | (a >> 15);
n++; }
if (n == 16) cout << "NO" << endl; } }
|