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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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;
}