**题目:一个数组除了两个数字以外,其余的都出现了两次,请找出这两个数字。
代码示例:**
#include<iostream>
using namespace std;
int FindFirst_1_FromRight(int n)//找一个数字的二进制最右边为1的序号,其中n不为零
{
int flag = 1;
int index = 1;
while (!(n&flag))
{
flag <<=1;
index++;
}
return index;
}
bool Is_1_NthFromRight(int num,int n)//判断一个数的二进制从最右边开始第n位是不是1
{
int flag = 1;
flag = flag << (n - 1);
if (num&flag)
return true;
else
return false;
}
int Left1_Right0(int a[], int n)//数组中元素的二进制第index位为1的位于左边,为0的位于右边,从而将数组分为两半
{
int temp = 0;
for (int i = 0; i < n; i++)
{
temp = temp^a[i];
}
int index = FindFirst_1_FromRight(temp);
int begin = 0;
int end = n - 1;
while (begin <end)
{
if (Is_1_NthFromRight(a[begin], index))
{
begin++;
}
else
{
if (Is_1_NthFromRight(a[end], index))
{
int temp = a[begin];
a[begin] = a[end];
a[end] = temp;
begin++;
end--;
}
else
{
end--;
}
}
}
return begin-1;
}
int main()
{
const int n =4;
int a[n] = { 1, 2,6,6};
int spilt_point = Left1_Right0(a, n);
int temp1 = 0;
int temp2 = 0;
for (int i =0; i <= spilt_point; i++)
temp1 = temp1^a[i];
for (int i = spilt_point + 1; i < n; i++)
temp2 = temp2^a[i];
cout << "原数组为:";
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
cout << "不同的两个数为:" << temp1 << " " << temp2 << endl;
}