Problem description |
One can determine the Gray code by its number using a very simple function: G(x) = x xor (x div 2), where xor stands for bitwise exclusive OR (bitwise modulo 2 addition), and div means integer division. It is interesting to note that function G(x) is invertible, which means it is always possible to uniquely restore x given the value of G(x). Write a program to restore number x from the given value of G(x). |
Input |
The input file contains an integer number y, the value of G(x). |
Output |
The output file should contain a single integer x such that G(x) = y. |
Sample Input |
15 1723 |
Sample Output |
10 1234 |
题意简单明了,不赘述。数据范围大,所以不可以用暴力。
有一点,位运算是可交换,可逆的。可以以此进行思考。
弱弱的很想说,自己测试了几组数据和A过的答案比了一下,都是对的,但是不知道为什么wa……
终于知道哪里错了……处理的时候最后一位忘了加上去…
#include <stdio.h>
#include <string.h>
int main()
{
__int64 n;
while(scanf("%I64d",&n)!=EOF)
{
int i,j,k;
int init[100],x[100];
__int64 p,q,r;
p=n;i=0;
memset(init,0,sizeof(init));
memset(x,0,sizeof(x));
while(p)
{
init[i++]=p&1;//printf("*%d\n",init[i-1]);
p=p>>1;
}
x[i-1]=0;q=0;
for(j=i-2;j>=0;j--)
{
x[j]=init[j+1]^x[j+1];
q+=x[j];
q=q<<1;
}
<span style="font-family: Arial, Helvetica, sans-serif;">q+=x[0]^init[0];</span>
printf("%I64d\n",q);
}
return 0;
}
‘&’通常拿来取数的末位。‘|’这个是或。刚开始把这两个弄混了。
啊还有,原先自己想的数据都能过,但是队友随手测了一个就不行……所以……想数据的时候,一定要有点技巧,如果普通的数据可以过,就多往边界想想,比如说0,1,这样的。