- 题目描述:
-
给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。
循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如:
1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110
- 输入:
-
第一行是个整数n, 0 < n < 300000,表示后面还有n行数据
后面是n行,每行有两个不大于65535的非负整数
- 输出:
-
对于每一行的两个整数,输出一行,内容为YES或NO
- 样例输入:
-
4 2 4 9 18 45057 49158 7 12
- 样例输出:
-
YES YES YES NO
自己对位运算确实不熟悉,看了看资料,循环左移为(a >> (N - n)) | (a << n)
但这样并不完全正确,答案应在&2的N次方
代码如下
1 #include <cstdio> 2 #include <cstdlib> 3 #define N 16 4 5 int lcf(unsigned int a, int n) { 6 int b = a >> (N - n); 7 int c = a << n; 8 return (b|c)&65535; 9 } 10 11 int main(int argc, char const *argv[]) 12 { 13 int m; 14 15 while(scanf("%d",&m) != EOF) { 16 int tmpa, tmpb; 17 while(m--) { 18 scanf("%d %d",&tmpa, &tmpb); 19 bool isOk = false; 20 for(int i = 0; i < N; i++) { 21 int tmpc = lcf(tmpa, i); 22 if(tmpc == tmpb) { 23 isOk = true; 24 break; 25 } 26 } 27 if(isOk) { 28 puts("YES"); 29 } 30 else { 31 puts("NO"); 32 } 33 } 34 } 35 return 0; 36 }