题目1151:位操作练习
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:942
解决:491
-
题目描述:
-
给出两个不大于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
还是觉得c++做字符串操作不如java方便
#include<stdio.h> #include<iostream> #include<string> using namespace std; string turnBin(int a) { string temp = ""; int i; char j ; while(a!=0) { i = a%2; a = a/2; j = i+'0'; temp = j+temp; } while(temp.size()!=16) temp='0'+temp; return temp; } string left(string s) { //printf("%s after left: ",s.c_str()); char temp = s[0]; for(int i = 0 ; i<15;i++) { s[i]=s[i+1]; } s[15]=temp; // printf("%s\n",s.c_str()); return s; } int main(){ string sa; string sb; int a,b; int n; int i,j; bool flag ; while(scanf("%d",&n)!=EOF) { for(i = 0 ; i<n ;i++) { flag = false; scanf("%d%d",&a,&b); sa = turnBin(a); sb = turnBin(b); // printf("%s %s\n",sa.c_str(),sb.c_str()); for(j = 1 ; j<16;j++) { if(sa==sb) { flag = true; break; } else { sa = left(sa); } } if(flag) { printf("YES\n"); } else { printf("NO\n"); } } } return 0; }