九度 找出两个只出现了一次的数字

/*
 * a.cpp
 *
 *  Created on: 2013-10-20
 *      Author: wangzhu
 */

#include<cstdio>
#include<iostream>
using namespace std;
#define NMAX 1010
int arr[NMAX];
//获取n的最末位的1
int find(int n) {
    return n & (n ^ (n - 1));
}
int main() {
    freopen("data.in", "r", stdin);
    int n,num1,num2,numTemp1,numTemp2;
    while(~scanf("%d",&n)) {
        for(int i = 0;i < n;i++) {
            scanf("%d",arr + i);
        }
        numTemp1 = 0;
        for(int i = 0;i < n;i++) {
            numTemp1 ^= arr[i];
        }
        numTemp2 = find(numTemp1);
        num1 = 0,num2 = 0;
        for(int i = 0;i <n;i++) {
            if(numTemp2&arr[i]) {
                num1 ^= arr[i];
            } else {
                num2 ^= arr[i];
            }
        }
        if(num1 > num2) {
            printf("%d %d\n",num2,num1);
        } else {
            printf("%d %d\n",num1,num2);
        }
    }
    return 0;
}

posted @ 2013-10-20 18:30  qingyezhu  阅读(152)  评论(0编辑  收藏  举报