给n个数
其中n-1个数出现了两次只有一个数出现了一次,找到它并输出
一组测试,输入n个数,均可用int表示
n<=10^7
由于0^0为0,0^1为1,所以0按位异或任何数都是这个数字本身;
对于两个相同的数字,由于每一位都相同,所以这两个数的按位异或为0,于是就抵消了;当数字不是按照两个相同数字连在一起给出时,会有以下几种情况:
ans = 0^n1 (第一个数) | n2 (第二个数) | ans ^= n2 (前两个数的按位异或) | ans ^= n1 (前两个数按位异或的结果再按位异或第一个数) |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
由此可见,当两个数据不相邻时,也可以将两个相同数字自行抵消
好高科技诶~~~
(思路源自行知哥哥~~)
代码:(281ms,236kb)
int num,ans;
ans = 0;
while ( scanf("%d",&num) != -1 )
{
ans ^= num;
}
printf("%d",ans);