NYOJ 528 找球号(三)
1 #include<stdio.h> 2 int main() 3 { 4 int i,res,n; 5 while(~scanf("%d",&n)){ 6 res=0; 7 while(n--){ 8 scanf("%d",&i); 9 res^=i; 10 } 11 printf("%d\n",res); 12 } 13 return 0; 14 }
我们先了解一下位异或的运算法则吧:
1、a^b = b^a。
2、(a^b)^c = a^(b^c)。
3、a^b^a = b。
对于一个任意一个数n,它有几个特殊的性质:
1、0^n = n。
2、n^n = 0。
所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。
还可以用STL中的set容器,不过好像没有上面的效率高,贴上代码:
1 #include<iostream> 2 #include<set> 3 using namespace std; 4 int main() 5 { 6 int i,n; 7 set<int>s; 8 while(cin>>n){ 9 while(n--){ 10 cin>>i; 11 if(s.find(i)==s.end()) 12 s.insert(i); 13 else 14 s.erase(i); 15 } 16 cout<<*s.begin()<<endl; 17 s.clear(); 18 } 19 return 0; 20 }