#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int Alone(int arr[], int len) {
// int n = 0;
// for (int i = 0; i < len; i++) {
// n ^= arr[i];
// }
// return n;
//}
//int main() {
// int arr[] = { 1,2,3,4,5,1,2,3,4 };
// int ret=Alone(arr,sizeof(arr)/sizeof(arr[0]));
// printf("%d\n", ret);
// return 0;
//}
void Find_Single_Dog(int arr[], int sz) {
int Single_Dog1 = 0;
int Single_Dog2 = 0;
int n = 0;
//先进行所有数字的异或 的出来的一定是两个单生狗异或的结果 101 110 011
for (int i = 0; i < sz; i++) {
n ^= arr[i];
}
//计算n中的二进制中第几位是1
int pos = 0;
for (int i = 0; i < 32; i++) {
if (((n >> i) & 1) == 1) {
pos = i;
break;
}
}
//分组
//把第i位为零的放在一个组中
for (int i = 0; i < sz; i++) {
if ((arr[i] >> pos & 1) == 0) {
Single_Dog1 ^= arr[i];
}
}
//n=5^6
//假使Single_Dog1=5 ——> 5^6^5 ==6 也就是给一个单身狗找一个女朋友了另外一个就还是单身狗
//假使Single_Dog1=6 ——> 5^6^6 ==5
Single_Dog2 = n ^ Single_Dog1;
printf("%d %d\n", Single_Dog1, Single_Dog2);
}
int main() {
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
Find_Single_Dog(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}