您的位置:首页 > 其它

UVaLive/LA 6809 Spokes Wheel(搜索,二进制循环移位)

2014-11-23 21:45 453 查看
// Author: Yuan Zhu
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;

int t;
char a[40], b[40];

int toint(char c) {
if(c >= '0' && c <= '9') return c - '0';
else return c - 'A' + 10;
}

int main() {
scanf("%d", &t);
for (int ca = 1; ca <= t; ca++) {
scanf("%s%s", a, b);
ll A = 0, B = 0, rA = 0, rB = 0;
for (int i = 0; a[i]; i++) A = A * 16 + toint(a[i]);
for (int i = 0; b[i]; i++) B = B * 16 + toint(b[i]);
ll AA = A, BB = B;
int cA = 0, cB = 0;
while (AA) cA++, AA /= 2;
while (BB) cB++, BB /= 2;
ll tmpA = A;
int l = -1, r = -1;
for (int i = 1; i < 32; i++) {
ll c = tmpA & 1;
tmpA >>= 1;
if (c) tmpA += (1LL << 31);
if (tmpA == B) {
r = i;
break;
}
}
tmpA = A;
for (int i = 1; i < 32; i++) {
ll c = tmpA & (1LL << 31);
tmpA <<= 1;
if (c) tmpA -= (1LL << 32), tmpA++;
if (tmpA == B) {
l = i;
break;
}
}
printf("Case #%d: ", ca);
if (A == B) printf("0 Any\n");
else if (l == -1 && r == -1) printf("Not possible\n");
else if (l == r) printf("%d Any\n", l);
else if (r < l) printf("%d Right\n", r);
else printf("%d Left\n", l);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息