每行有两个不大于65535的非负整数
对于每一行的两个整数,输出一行,内容为YES或NO
2 4 9 18 45057 49158 7 12
YES YES YES NO
#include<stdio.h>
#include<math.h>
int main (void){
int a,c;
while(scanf("%d %d",&a,&c)!=EOF){
int flag=0;
int * conversion(int a);
int *b;
int *d;
b=conversion(a);
//一共可以进行16次循环左移,每次循环判断左右两数能否相等
for(int k=0;k<16;k++){
int temp=b[15];
//接下来开始进行一次的左移
for(int i=0;i<16;i++){
*(b+15-i)=*(b+15-1-i);
}
b[0]=temp;
//这个用来看转换为的二进制
// for(int i=0;i<16;i++){
// printf("%d ",*(b+i));
// }printf("\n");
//计算移位后的值
int out=jisuan(b);
// printf("%d ",out);
// printf("\n");
if (out==c){
flag=1;
}
}
// printf("\n");
d=conversion(c);
//一共可以进行16次循环左移,每次循环判断左右两数能否相等
for(int k=0;k<16;k++){
int temp=d[15];
//接下来开始进行一次的左移
for(int i=0;i<16;i++){
*(d+15-i)=*(d+15-1-i);
}
d[0]=temp;
// //这个用来看转换为的二进制
// for(int i=0;i<16;i++){
// printf("%d ",*(b+i));
// }printf("\n");
//计算移位后的值
int out=jisuan(d);
// printf("%d ",out);
if (out==a){
flag=1;
}
}
if(flag==1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
//这个函数用来转换进制
int * conversion(int a){
int jishu=0;
int cunchu[100];
int n=0;
while(a!=1){
n=a%2;
a=a/2;
cunchu[jishu]=n;
jishu+=1;
}
cunchu[jishu]=1;
int zong=jishu+1;
int se[zong];
for(int j=0;j<zong;j++){
se[j]=cunchu[jishu-j];
}
//补全16位
int se17[17];
for(int i=0;i<zong;i++){
se17[i]=se[i];
}
for(int i=zong;i<16;i++){
se17[i]=0;
}
se17[16]=9;
int *r=se17;
return r;
}
int jisuan(int a[16]){
int sum=0;
for(int i=0;i<16;i++){
sum+=a[15-i]*pow(2,i);
}
return sum;
}