关于位运算的水题
找数字2 |
Time Limit: 25000ms, Special Time Limit:50000ms, Memory Limit:32768KB |
Total submit users: 92, Accepted users: 67 |
Problem 11466 : No special judgement |
Problem description |
给定2n+1个数字,只有一个数字出现了奇数次,其余的数字都出现了偶数次,现在你需要找出出现奇数次的数字。 |
Input |
包含多组数据,每组数据第一行为一个数n(0<=n<=5000000)。接下来一行包括2N+1个数字。 |
Output |
对于每组数据,输出出现奇数次的数字. |
Sample Input |
1 1 1 1 2 1 2 1 3 3 3 1 1 2 2 3 3 4 |
Sample Output |
1 2 4 |
这是湖师大的14年校赛的一道水题
题目的意思很清楚就是说要你在输入的数字中找出出现奇数次次数的数字
我刚上手就是两个for的嵌套,但是给出的数据很大,所以TLE了
后来哈德斯告诉我其实这个题目可以用位运算来做,然后我就看了看位运算
就有:
1^1=0 0^0=0
1^0=1 1^0=1
布尔型的就有:
True ⊕ False = True
False ⊕ True = True
False ⊕ False = False
True ⊕ True = False
如果是两个十进制的数的话,就会把十进制的数字先转化为二进制,然后再进行异或运算,这样统计出现奇数次个数数字的问题就解决了。
代码如下:
1 #include<stdio.h> 2 using namespace std; 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n)!=EOF) 7 { 8 int a,b=0; 9 for(int i=1;i<=2*n+1;i++) 10 { 11 scanf("%d",&a); 12 b^=a; 13 } 14 printf("%d\n",b); 15 } 16 return 0; 17 }