题意:给你9个数,着9个数分别为x1,x2,x3,x4,x5,x6,x7,x8,(x1+x2+...+x8)与m异或之后的值,求m。
解法:对m的二进制,从最低位一位一位往高位求, 例如对最低位,若给你的9个数的最低位有奇数个1(必然也有奇数个0),则说明x1到x8中有奇数个奇数,奇数个偶数,
则x1+x2+...+x8的值必为奇数(即二进制最低位为1),所以若(x1+x2+...+x8)与m异或后的值的最低位为1,则m的最低位为0,否则m的最低位为1。类似的,可以一
位一位地求m的二进制高位,但是注意:对进位的判断。
#include <iostream>
#include <cstdio>
using namespace std;
int up, num[10]; //up为进位的值
int judge ()
{
int one = 0;
for (int i = 1; i < 9; i++) {
one += num[i] % 2;
num[i] = num[i] >> 1;
}
int lastbit = num[9] % 2, res;
num[9] = num[9] >> 1;
if (((one + up) % 2 == 0 && lastbit == 0) || ((one + up) % 2 == 1 && lastbit == 1)) {
res = 0; up = (one + up) >> 1;
}
else { res = 1; up = (8 - one + up) >> 1; }
return res;
}
int main()
{
int t, i;
scanf ("%d", &t);
while (t--)
{
up = 0;
for (i = 1; i < 10; i++) scanf ("%d", &num[i]);
int ans = 0, po = 0;
while (true)
{
for (i = 1; i < 10; i++) if (num[i] != 0) break;
if (i == 10) break;
int res = judge ();
ans += (res << po);
po++;
}
printf ("%d\n", ans);
}
return 0;
}