HLG 1128 Find Them【位运算】

Description

给出N个数(保证N为偶数),其中有且只有两个不同的数字出现了奇数次。请你找出他们来。

Input

对于每组测试数据:

第一行,给出数字N,表示下一行输入N个数字,其中N为偶数(2<=N<=100000)

第二行,有N个数字(每个数字保证可以使用INT表示)

处理到文件结束

Output

对于每组测试数据:

第一行,输出找到的两个数字,由小到大。

Sample Input
4
1 2 3 3
Sample Output

1 2

分析: 第一次读入得到a^b;  第二次读入时根据a^b为1的位来把数据分为该位为1和0的两组,然后再分别异或得到a,b;

code:

View Code
#include<stdio.h>
int a[100001];
int main()
{
int c,g,n,i,d,k;
while(scanf("%d",&n)!=EOF)
{
c=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
c^=a[i];
}

k=c&((c-1)^(c))
c=d=0;
for(i=0;i<n;i++)
{
if(a[i]&k)
c^=a[i];
else d^=a[i];
}
if(c>d)
printf("%d %d\n",d,c);
else printf("%d %d\n",c,d);
}
return 0;
}


posted @ 2012-03-16 17:10  'wind  阅读(149)  评论(0编辑  收藏  举报