输入一个长度为n的数组,考虑所有不同的数字,有且只有2个数字出现了奇数次。
比如对于1 2 3 1 2 3 1 2,我们考虑所有不同的数字1 2 3,有且只有1,2出现了奇数次(均为3次)
输出这两个出现了奇数次的数字。先输出这两个数字中较小的,再输出较大的。
(1 <= n <= 100000,1 <= a[i] <= 10^9)
Input
第一行一个整数n, 接下来一行n个整数,表示输入的数字。
Output
一行2个数字,表示出现了奇数次的数字,先输出小的,再输出大的。
Sample Input
8
1 2 3 1 2 3 1 2
Sample Output
1 2
#include <stdio.h>
int a[100005]={0};
int main()
{
int n,i,k=0,ans0=0,ans1=0,sum=0,m;
scanf("%d",&n);
for(i=0;i<n;i++)//先求出这两个奇数次的数异或的结果K;
{
scanf("%d",&a[i]);
k^=a[i];
}
while(1)
{
if(k&1==1)//找出k的二进制中不是0的一位,这一位是两个奇数次的数二进制下不同的一位(1^0=1)
break;
else
{
sum++;//记录位数;
k>>=1;
}
}
for(i=0;i<n;i++)
{
m=a[i]>>sum;
if(m&1==1)//该位下为1时;
ans0^=a[i];
else//该位下为0时;
ans1^=a[i];
}
if(ans0<ans1)
printf("%d %d",ans0,ans1);
else
printf("%d %d",ans1,ans0);
return 0;
}