-
题目描述:
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
-
输入:
-
每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2<=n <= 10^6。第二行包含n个整数,表示数组元素,元素均为int。
-
输出:
- 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
-
样例输入:
-
8 2 4 3 6 3 2 5 5
-
样例输出:
-
4 6
-
-
/
-
-
这个就是考察位运算,当两个相同的数按位异或时,结果为0。所以将所有数异或,留下的是不相同的两个数的异或结果。
-
-
这个结果肯定至少有一位是1,就是这两个数的二进制不相等的所有位,选个最低位,将所有数分成这个位为1和不为1的两组,再分别求得的异或值就是这两个数。
-
-
-
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> using namespace std; int v[1000001]; int main() { int n,j,temp; while(cin>>n&&n>1) { int sum=0; for(j=0;j<n;j++) { scanf("%d",&v[j]); sum=sum^v[j]; } j=0; while(!((sum>>j)&1)) j++; temp=1<<j; int sum2=0; sum=0; for(j=0;j<n;j++) { if(v[j]&temp) sum=sum^v[j]; else sum2=sum2^v[j]; } cout<<(sum<sum2?sum:sum2)<<" "<<(sum>sum2?sum:sum2)<<endl; } return 0; } /************************************************************** Problem: 1351 User: 午夜小白龙 Language: C++ Result: Accepted Time:660 ms Memory:5424 kb ****************************************************************/