问题:数组中,有三个数只出现1次,其他都出现2次。找出来那三个数。
#include<iostream> using namespace std; unsigned int setbit(unsigned int a) { return (a & (~(a-1))); //只保留最右边的1 } int main() { int A[] = {10,14,2, 3,3,4,4,5,5,6,6,7,7,9,9,12,12,13,13}; int n = sizeof(A)/sizeof(int); unsigned int norresult = 0; unsigned int flag = 0; for(int i=0;i<n;i++) norresult ^= A[i]; for(int i=0;i<n;i++) flag ^= setbit(norresult^A[i]); flag = setbit(flag); //用flag来划分数组 unsigned int nor1 = 0; unsigned int nor2 = 0; for(int i=0;i<n;i++) { if(setbit(norresult^A[i]) == flag) nor1 ^= A[i]; else nor2 ^= A[i]; } cout<<"First num: "<<nor1<<endl; //已经找出第一个数 nor2 = setbit(nor2); //用nor2来划分数组(不包括以找出的nor1) unsigned int nor3 = 0; unsigned int nor4 = 0; for(int i=0;i<n;i++) { if((A[i] ^ nor1) == 0) //注意运算符优先级 continue; if((nor2 & A[i]) == 0) //注意运算符优先级 nor3 ^= A[i]; else nor4 ^= A[i]; } cout<<"Second num: "<<nor3<<endl; cout<<"Third num: "<<nor4<<endl; return 1; }
参考自:http://zhedahht.blog.163.com/blog/static/25411174201283084246412/