hdu 2095 find your present (2)

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\n",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\n", a);  
14     }  
15     return 0;  
16 }  

posted on 2014-07-24 09:53  薛定谔的熊猫  阅读(124)  评论(0编辑  收藏  举报

导航