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

/*

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

}

你可能感兴趣的:(数字)