链接: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\n",ans);
	}
	return 0;
}


虽然知道位运算的使用办法,,但一直没有用过,。直到今天才知道原来这么强大~