思路:异或数组中的每一个数,最终出现的结果是两个只出现一次数字的异或结果,,因为两个数组不一样,所以异或结果不为0,二进制结果有一个是1.在结果中找到第一个为1的位置,记为n,然后数组右移n位,为1,为0,分别输出两个数
#include <stdio.h>
#include<Windows.h>
int two(int n)
{
int c = 0;
while (n)
{
if (n % 2 == 1)
{
return c;
}
c++;
n /= 2;
}
return -1;
}
void find_two(int*a, int size,int *p,int *q)
{
int find = 0;
int ret = 0;
for (int i = 0; i < size; ++i)
{
find ^= a[i];
}
ret = two(find);
for (int i = 0; i < size; ++i)
{
if (1 & (a[i] >> ret))
{
*p ^= a[i];
}
else
{
*q ^= a[i];
}
}
}
int main()
{
int a[8] = { 1,1,3,3,4,5,6,6 };
int size = sizeof(a) / sizeof(a[0]);
int p = 0;
int q = 0;
find_two(a, size,&p,&q);
printf("%d,%d\n", p,q);
system("pause");
return 0;
}