1 //1.一个数组中只有两个数字是出现一次,
2 //其他所有数字都出现了两次。
3 //找出这两个数字,编程实现。a
4
5 //^=单独两个数的^结果
6 //单独出现的两个数不同位的标记
7 //position: ^结果中第一个出现1的位置
8 //position位两个数肯定有一个为0 ,一个为1
9 //把数组分成两部分
10 //1:position为1
11 //2:position为0
12 //每一部分都有一个只出现一次的数字,其他的都是成对出现
13 //每一部分^结果为单独出现的数字
14 #include<stdio.h>
15 #include<stdlib.h>
16
17 int main()
18 {
19 int arr[] = { 1, 3, 4, 5, 6, 6, 5, 1 };
20 int len = sizeof(arr) / sizeof(arr[0]);
21 int ret = 0;
22 int i = 0;
23 int pos = 0;
24 int x = 0;
25 int y = 0;
26 //整体^一次
27 for (i = 0; i < len; i++)
28 {
29 ret ^= arr[i];
30 }
31 //寻找第一个1的位置
32 for (i = 0; i < 32; i++)
33 {
34 if ((ret >> i) & 1 == 1)
35 {
36 pos = i;
37 break;
38 }
39 }
40 //把数组分成两部分
41 for (i = 0; i < len; i++)
42 {
43 //如果pos位置为1
44 if (((arr[i] >> pos)&1)==1)
45 {
46 x ^= arr[i];
47 }
48 //位置为0
49 else
50 {
51 y ^= arr[i];
52 }
53 }
54 printf("%d %d", x, y);
55 system("pause");
56 return 0;
57 }