http://acm.hdu.edu.cn/showproblem.php?pid=2095
要找出出现奇数次的数字,我使用了一种大概是归并的方法,相同的就把flag=!flag,不同的就往后继续一个,感觉有超时的可能但没想到更好的办法就试了下,没想到能AC了...囧
代码如下:
1 #include<stdio.h> 2 #define MAX 10000 3 struct Nu 4 { 5 int number; 6 int flag; 7 }; 8 int main() 9 { 10 int n; 11 while(scanf("%d",&n)!=EOF&&n) 12 { 13 struct Nu a[MAX]; 14 int i,j,ad=0,x; 15 for(i=0;i<n;i++) 16 { 17 scanf("%d",&x); 18 for(j=0;j<ad;j++) 19 { 20 if(a[j].number==x) 21 { 22 a[j].flag=!a[j].flag; 23 break; 24 } 25 } 26 if(j==ad) 27 { 28 a[ad].number=x;a[ad].flag=1; 29 ad++; 30 } 31 } 32 for(i=0;i<=ad;i++) 33 { 34 if(a[i].flag==1) 35 printf("%d ",a[i].number); 36 } 37 } 38 }
后来上网搜了大神们的代码,大神都用异或运算来解决奇数的问题,正好学习下~
异或运算法则:
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
4. a ^ b ^ a = b.
利用法则四,可以把奇数项找出来。
1 #include <stdio.h> 2 int main() 3 { 4 int a, n, b; 5 while(scanf("%d", &n), n) 6 { 7 a = 0; 8 while(n--) 9 { 10 scanf("%d", &b); 11 a ^= b; 12 } 13 printf("%d ", a); 14 } 15 return 0; 16 }