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;
}

 

posted @ 2013-09-10 08:32  sumile  阅读(153)  评论(0)    收藏  举报