//问题描述:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。
//数组中只出现一次的两个数字
//----------------------------------
#include<iostream>
using namespace std;
const int MAXN = 10;
void FindTwoNotRepeat(int a[], int n, int *pN1, int *pN2);
void printArr(int a[], int n);
int main(){
cout<<"*****************Jeremy_W*********************"<<endl;
cout<<"本例找出整形数组中只出现一次的两个数字"<<endl;
cout<<"*****************Jeremy_W*********************"<<endl;
int Num1,Num2;
int a[MAXN] = {1,2,3,4,5,8,4,3,2,1};
cout<<"目标数组为:";
printArr(a, MAXN);
FindTwoNotRepeat(a, MAXN, &Num1, &Num2);
cout<<"只出现一次的数字为:"<<Num1<<", "<<Num2<<endl;
return 0;
}
//核心算法函数
void FindTwoNotRepeat(int a[], int n, int *pN1, int *pN2){
int i,j,temp;
temp = 0;
for(i = 0; i < n; i++)
temp ^= a[i]; //两个只出现一次数字的异或结果
for(j = 0; j<sizeof(int)*8; j++)
if(((temp >> j)&1) == 1)
break; //确定第j位为两数字的不同位
*pN1 = 0, *pN2 = 0;
for(i = 0; i < n; i++){
if(((a[i] >> j)&1) == 1) //将数组分成两半,每部分都含一个只出现一次的数字
*pN1 ^= a[i];
else
*pN2 ^= a[i];
}
}
void printArr(int a[], int n){
for(int i = 0; i < n; i++)
cout<<a[i]<<" ";
cout<<endl;
}