思路:
1.首先将这102个数异或,得到的结果等同于这两个只出现一次的数异或;
2.然后找出结果从右向左第一个1在哪个位(即找到这两个数一定不一样的地方);
3.按照2所述原则用‘与’的方法将这102个数据分出两个阵营,然后在各自阵营里再去异或,找到各自阵营中只出现了一次的数;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define M 6 //为方便测试,将102改为6
int main() {
int group[M];
printf("Please input %d num:\n", M);
for (int i = 0; i < M; ++i) {
scanf("%d", &group[i]);
}
int num=0;
for (int i = 0; i < M; ++i) { //102个数异或,得到的结果与2个只出现一次的数异或的结果相同
num = num ^ group[i];
}
//只有两数的某位不同,异或结果才能为1,
//找出异或结果从右向左哪一位是1,从而根据该位将所有数据分成两部分
//,两部分分别异或即可分别找出只出现一次的数
int result = num & (-num);
int num1 = 0, num2 = 0;
for (int i = 0; i < M; ++i) {
if ((group[i] & result) == 0) {
num1 = num1 ^ group[i];
}
else {
num2 = num2 ^ group[i];
}
}
printf("Those num who appear just once are %d,%d\n", num1, num2);
}