思路:
两个数字相同异或为 0 ,相异异或为 1 ,任何数与 0 异或都等于它自己。
一、 两个数字相同异或为 0 ,相异异或为 1 ,任何数与 0 异或都等于它自己。
二、 将所有的数字异或一遍,储存在sum中。 2. 因为根据异或法则,相同为 0 ,相异为 1,那么如果两个数异或的结果sum中二进制位中有1,就说明这两个数字不一样。找num二进制位中的1,遍历32次就可以检查所有位。一旦找到一个位是1,我们便出循环不再查找。结果储存在n中。
三、 分组,如果是1分到sum1,0分到sum2
四、 例如数组int arr[10] = { 1, 2, 3, 2, 4, 6, 1, 8, 3, 4 }; 中出现一次的数为6,8
#include <stdio.h>
#include <stdlib.h>
int main(){
int sum = 0;
int arr[10] = { 1, 2, 3, 2, 4, 6, 1, 8, 3, 4 };
int i;
for (i = 0; i < 10; i += 1){
sum ^= arr[i];
}
int n = -1;
for (i = 0; i < 32; i += 1){
if (sum >> i & 1){
n = i;
break;
}
}
int sum1 = 0;
int sum2 = 0;
for (i = 0; i < 10; i += 1){
if (arr[i] >> n & 1){
sum1 ^= arr[i];
}
else{
sum2 ^= arr[i];
}
}
printf("%d %d\n",sum1,sum2);
system("pause");
return 0;
}