本题的核心思想就是一个数异或相同的两个数时会等于他本身,所以当0异或这个数组的数字时,最终得到的数字就是需要找到的两个数字异或的结果,然后找到它二进制为1的一位,将原来的数组分为两组,再异或就能得到结果。
#include<stdio.h>
void find(int* arr, int sz)
{
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int flag = 0;
for (i = 0; i < sz; i++)
{
a = a ^ arr[i];
}
for (i = 0; i < 32; i++)
{
if (((a >> i) & 1) == 1)
{
break;
}
else {
flag++;
}
}
for (i = 0; i < sz; i++)
{
if (((arr[i] >> flag) & 1) == 1)
{
b = b ^ arr[i];
}
else
{
c = c ^ arr[i];
}
}
printf("%d, %d\n", b, c);
}
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 2, 1, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
find(arr, sz);
system("pause");
return 0;
}