1.一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void Find_T(int a[], int num, int *xp, int *yp)
{
//整体^结果必不为0
int temp = a[0];
int i = 1;
for (; i < num; i++){
temp ^= a[i];
}
//找出比特位为1的比特位 该比特位为1是需要找出的两个不同数^的结果
int pos = 0;
while (temp){
if ((temp >> pos) & 1){
break;
}
pos++;
}
//根据pos+1位比特位的值将数据分为两组,相同的数必定在同一组,此时,不同的数分到两组 两组分别通过^就得到了这两个数
*xp = 0;
*yp = 0;
for (i = 0; i < num; i++){
if ((a[i] >> pos) & 1){
*xp ^= a[i];
}
else{
*yp ^= a[i];
}
}
}
int main()
{
int a[]={1,2,3,4,5,1,2,3};
int num=sizeof(a)/sizeof(a[0]);
int x = 0;
int y = 0;
Find_T(a,num,&x,&y); //参数x,y将不同的两个数返回
printf("%d %d\n", x, y);
system("pause");
return 0;
}