find your present (2) 2095

Problem Description

In the new year party, everybody will get a "special present".Now it‘s your turn to get your special present, a lot of presents now putting on the desk, and only one of them will be yours.Each present has a card number on it, and your present‘s card number will be the one that different from all the others, and you can assume that only one number appear odd times.For example, there are 5 present, and their card numbers are 1, 2, 3, 2, 1.so your present will be the one with the card number of 3, because 3 is the number that different from all the others.

Input

The input file will consist of several cases. 
Each case will be presented by an integer n (1<=n<1000000, and n is odd) at first. Following that, n positive integers will be given in a line, all integers will smaller than 2^31. These numbers indicate the card numbers of the presents.n = 0 ends the input.

Output

For each case, output an integer in a line, which is the card number of your present.

Sample Input

5
1 1 3 2 2
3
1 2 1
0

Sample Output

3
2

Hint

Hint

use scanf to avoid Time Limit Exceeded

Author

8600

Source

HDU 2007-Spring Programming Contest - Warm Up (1)

Recommend

8600   |   We have carefully selected several similar problems for you:  2094 1008 1597 1593 1595

 1 //map
 2 #include <set>
 3 #include <stdio.h>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,x;
 8     set <int> S;
 9     while(scanf("%d",&n),n)
10     {
11         while(n--)
12         {
13             scanf("%d",&x);
14             if(S.find(x) == S.end())    //没找到,插入
15                 S.insert(x);
16             else                        //找到了,删除
17                 S.erase(x);
18         }
19         printf("%d\n",*S.begin());
20         S.clear();
21     }
22     return 0;
23 }
 1 //排序
 2
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cstdlib>
 7 using namespace std;
 8
 9 long long int a[1000010];
10
11 int main()
12 {
13     int n;
14     while (scanf("%d",&n) && n)
15     {
16         for (int i = 0; i<n; i++)
17             scanf("%lld",&a[i]);
18         sort(a, a+n);
19         int i;
20         for (i = 1; i<n; i++)
21         {
22             if (a[i] != a[i-1]  &&  a[i] != a[i+1])
23                 break;
24         }
25         printf("%lld\n",a[i]);
26     }
27     return 0;
28 }
 1 #include <math.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <stdio.h>
 5 long a[100000100];
 6 int main()
 7 {
 8
 9     memset(a,0,sizeof(a));
10     long n;
11     while(scanf("%ld",&n)!=EOF&&n!=0)
12     {
13         long long m;
14     for(int i=0;i<n;i++)
15         {
16             scanf("%lld",&m);
17             a[m]+=1;
18         }
19     for(int i=0;i<100000100;i++)
20     {
21        if(a[i]==1)
22        {
23              printf("%lld\n",i);
24        }
25     }
26     }
27     return 0;
28 }

其实,这题还有个更好的方法————位异或。

我们先了解一下位异或的运算法则吧:

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。

所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int n,x,ans;
 5     while(scanf("%d",&n),n)
 6     {
 7         ans = 0;
 8         while(n--)
 9         {
10             scanf("%d",&x);
11             ans ^= x;
12         }
13         printf("%d\n",ans);
14     }
15     return 0;
16 }
时间: 2024-10-24 02:54:04

find your present (2) 2095的相关文章

杭电acm 2095 find your present (2)

#include<iostream>using namespace std;int main(){    int n,x,y;    while(cin>>n,n)    {         cin>>x;                   while(--n)         {             cin>>y;             x=x^y;         }         cout<<x<<"\n&q

hdoj 2095 find your present (2) 【位运算】

题意:找出现次数不同于其他数的数. 超时了一次,后来知道了位运算...长见识了 0^0 =0 0^1=1 1^0=1 1^1=0 0^1^1 = 0 可以发现 任何数异或0还是他本身. 一个数异或另一个数偶数次还是他本身. 代码(位运算都600+ms): #include <stdio.h> #include <math.h> int main() { int a, b, n; while(scanf("%d", &n), n){ scanf("

hdu 2095 find your present (2) 找到只出现一次的数字

find your present (2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 15349    Accepted Submission(s): 5821 Problem Description In the new year party, everybody will get a "special present"

hdu 2095 find your present(2)

find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 5186 Accepted Submission(s): 1513   Problem Description In the new year party, everybody will get a "special present".Now

杭电 2095 find your present (2)【位运算 异或】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2095 解题思路:因为只有我们要求的那个数出现的次数为奇数,所以可以用位运算来做,两次异或同一个数最后结果不变,那么就可以知道异或运算相当于过滤掉了出现次数为偶数的数,最后只留下了唯一的那一个出现次数为奇数的数. 反思:位运算好陌生,好好学. #include<stdio.h> int main() { int n; long int a; while(scanf("%d",&a

HDU 2095 find your present(异或)

题意 求一组数中只出现过奇数次的数  输入保证只有一个数满足 知道一个数与自己的异或等于0  与0的异或等于自己就行咯 #include<cstdio> using namespace std; int main() { int n, t, ans; while(scanf("%d", &n), n) { ans = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &t); ans = an

(HDUSTEP 2) hdu 2095 find your present (2)(找到出现奇数次的那个数)

题目如下: find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 6275 Accepted Submission(s): 1639   Problem Description In the new year party, everybody will get a "special present"

hdu 2095 find your present (2)

题意:给n个正整数,并保证只有一个数是与众不同的,要你找出与众不同的数. 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1000005]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=0; i<n; i++) scanf(&qu

HDU 2095 find your present (2) 异或

异或 暴力开数组,然而明显不过,要求32768k,结果超时了 #include <cstdio> #include <cstring> int book[1000000]; int main() { int n; while (scanf("%d", &n) && n) { int a; memset(book, 0, sizeof(book)); for (int i = 0; i < n; i++) { scanf("