链接: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;
}
虽然知道位运算的使用办法,,但一直没有用过,。直到今天才知道原来这么强大~