杭电 find your present (2) (异或)
题目描述(Problem Description)
在新年晚会上,每个人都会得到一份“特别的礼物”。现在轮到你去拿你的特别礼物了,桌上放了很多礼物,其中只有一件是你的。每件礼物上都有一个卡号,而你礼物的卡号将是与其他礼物不同的卡号,你可以假设只有一个数字出现奇数次。例如,有5个礼物,他们的卡号是1,2,3,2,1。所以你的礼物将是卡号为3的那一个,因为3是与所有其他数字不同的数字。
输入(Input)
输入文件将由几个案例组成。
首先,每个案例将由整数n(1<=n<1000000,n为奇数)表示。然后,在一行中给出n个正整数,所有整数都小于2^31。这些数字表示礼物的卡号。n=0结束输入。
输出(Output)
对于每种情况,在一行中输出一个整数,即您当前的卡号。
样本输入(Sample Input)
5
1 1 3 2 2
3
1 2 1
0
样本输出(Sample Output)
3
2
注:use scanf to avoid Time Limit Exceeded
题解
异或:将输入的所有整数异或,出现偶数次的整数会被抵消,最终输出的就是不重复的整数。
例如:输入[1 1 3 2 2],根据异或运算规则
(相同为0,相异为1)
1^1=0
0^0=0
1^0=0
0^1=0
0^N=N (N为任意整数)
N^N=0
得
1^1=0
0^3=3(把0和3转换成二进制再异或)
3^2=1
1^2=3
所以输出为3
代码(C++)
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,a,x=0;//x初始化为0,因为 0^N=N (N为任意整数)
while(scanf("%d",&n),n) {
while(n--) {
scanf("%d",&a);
x=x^a;//x用来存储输入的所有整数异或的结果
}
printf("%d\n",x);
x=0;
}
return 0;
}