##一组数中的数都是两两成对出现,找出其中单独存在的两个数
#include <stdio.h>
#include <windows.h>
//{
// int a[] = {1,4,2,3,1,3,4,5,2,6 };
// int i = 0;
// int j = 0;
// int sz = sizeof(a) / sizeof(a[0]);
// while (i < sz){
// for (j = 0; j < sizeof(a) / sizeof(a[0]); j++)
// {
// if (a[i] == a[j] && (i != j))
// {
// i++;
// break;
// }
// }
// if (j == sz)
// printf("%d ", a[i++]);
// }
//
//
// return 0;
//}
void find_dif(int arr[],int sz )
{
int i = 0;
int ret1 = 0;
int ret2 = 0;
int ret = arr[0];
int count = 0;
for (i = 1; i <sz ; i++)
ret ^= arr[i]; //得到两个不同数的异或结果
for (i = 0; i < 32; i++)
{
if ((ret >> i) & 1 == 1)
{
count = i; //两个数异或,相同为0相反为1,找出它们二进制位上相反的一位,标记
break;
}
}
ret1 = ret;
ret2 = ret;
for (i = 0; i < sz; i++) //将所有数分成两部分,将单独的数一边分一个,然后一起异或
{
if (((arr[i] >> count) & 1 )== 0){
ret2 ^= arr[i];
}
if (((arr[i] >> count) & 1) == 1)
{
ret1^= arr[i];
}
}
printf("%d %d", ret1, ret2);
}
int main()
{
int arr[] = { 1, 1, 2, 2, 4, 6, 5, 5 };
int sz = sizeof(arr) / sizeof(arr[0]);
find_dif(arr,sz);
system("pause");
}