链接:http://acm.hdu.edu.cn/showproblem.php?pid=2095
这道题对内存限制比较大,Memory Limit: 32768/1024 K (Java/Others);根本不可能开大数组来计数。自己做的时候各种超内存。
后来看了网上大神的思路:
按位异或有这样的性质:
a^0=a
a^a=0
异或运算法则:
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.
所以,判断一个数是否出现了偶数次只需它每出现一次,就对一个变量运算一次异或。因为只有一个出现奇数次,所以最后这个变量的值就是缺少的那个。
这样,就不用数组了。
#include <stdio.h> int main() { int n,tem,ans; while(scanf("%d",&n),n) { tem = 0; while(n--) { scanf("%d",&tem); ans ^= tem; } printf("%d ",ans); } return 0; }
虽然知道位运算的使用办法,,但一直没有用过,。直到今天才知道原来这么强大~