思路分析:
先对数组进行一次异或运算,得到两个单独出现的数字异或之后的结果
10 1010
12 1100
异或之后得到6 0110
两个1代表它们的这两位分别不同
根据这一位上的数字不同可以将数组分成两组,一组为这一位数字为1,另一组为这一位数字为0
分别对这两组数字进行异或运算就可以得到两个单独出现的数字
代码示例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[10] = { 8, 12, 10, 11, 9, 11, 9, 2, 2, 8 };
int i, sum=0;
for (i = 0; i < 10; ++i) //查找单独不配对的数的写法
{
sum ^= arr[i];
}
//printf("%d ", sum);
//printf("%d \n", 10 ^ 12);
int a;// 用来记录哪一位是1
int num1 = 0;
int num2 = 0;
for (i = 0; i < 32; ++i)
{
if (sum & 1 << i) //在sum里面找每一位 看是否为1,如果是1,记录位置
{
a = i;
break;
}
}
for (i = 0; i < 10; ++i)
{
if (arr[i] & 1 << a) //在数组中查找那一位为1的数归为一组,不为1的为一组
{
num1 ^= arr[i];//对两组数分别异或就可以找出两组数种单独出现的一个
}
else
{
num2 ^= arr[i];
}
}
printf("%d %d ", num1, num2);
system("pause");
return 0;
}