找球号(三)
时间限制:2000 ms | 内存限制:3000 KB
难度:2
- 描述
xiaod现在正在某个球场负责网球的管理工作。为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数。有一天,xiaod发现少了一个球,你能帮他找出丢的那个球的球号吗?
- 输入
- 有多组测试数据。每组数据包括两行。 第一行是一个整数N(0<N<1000000),表示现在所剩的球数。 随后的一行是N个数,表示所剩的各个球的编号M(0<M<10^9)。
- 输出
- 对于每组数据,输出弄丢的那个球的球号。
- 样例输入
5
1 1 3 6 6
3
1 2 1- 样例输出
3
2- 来源
- hdu改编
- 上传者
- ACM_丁国强
#include <stdio.h> int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,a,s=;
for(i=;i<n;i++)
{
scanf("%d",&a);
s ^= a;
}
printf("%d\n",s);
}
return ;
}
//位运算--异或位异或:
位异或的运算法则吧:
1、a^b = b^a。
2、(a^b)^c = a^(b^c)。
3、a^b^a = b。
对于一个任意一个数n,它有几个特殊的性质:
1、0^n = n。
2、n^n = 0。
所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。
ps:还可以用异或来交换变量
#include <stdio.h>
void swap(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
swap(n,m);
printf("%d %d\n",n,m);
}
return ;
}