Hello World!
//
//问题描述:在一组数中,只有两个不同的数,其它数字成对出现,任给一组数字,找出仅出现一次的两个数
//算法思想:将数组中所有元素异或,异或结果为仅出现一次的两个数的异或结果。再从最低位找出第一个为1的位(假设为i位),
//说明这两个数在此位上不同,可以此位为依据将数组中的
//元素分为两组,第i位为1的一组,第i位为0的一组,再分别将两组所有元素异或,则可找出在子数组中只出现一次的数,也就是整个数组中仅出现一次的不同的两个数。
#include "stdafx.h"
#include<iostream>
using namespace std;
void find2(int a[],int n)
{
int tmp=a[0];
int result_0,result_1;
int flag_0=0,flag_1=0;
for(int i=1;i<n;i++)
tmp^=a[i]; //tmp存储数组中所有元素的异或结果
int k=0;
while(!(tmp&0x1)) //找出从低位开始第一个为1的位的位置
{
tmp=tmp>>1;
k=k+1;
}
for(int i=0;i<n;i++)
{
if((a[i]&(0x1<<k))) //判断第k位是否为1
{
if(flag_0==0)
{
result_0=a[i];
flag_0=1;
}
else
{
result_0^=a[i]; //result_0存储第k位为1的元素的异或结果
}
}
else
{
if(flag_1==0)
{
re sult_1=a[i];
flag_1=1;
}
else
result_1^=a[i];//result_1存储第k位为0的元素的异或结果
}
}
cout<<result_0<<" "<<result_1<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={2,5,2,3,4,4};
find2(a,6);
return 0;
}
浙公网安备 33010602011771号