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

来源:互联网 发布:c语言开发实战 pdf 编辑:程序博客网 时间:2024/05/16 08:54
// Author: Yuan Zhu#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define ll long longusing 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;}

0 0