hdu 2095 find your present (2)
题解:
用到异或的知识,a^a = 0, a^0 = a. 因为题目中说道你的礼物的号码有奇数个,其它的号码有偶数个。把每个数用异或符连接起来,运算号就剩下一个本来奇数个的号码了。
例如a^b^c^c^b^a^c = a^a^b^b^c^c^c = 0^0^0^c = c(a, b, c代表任意整数)
代码如下:
#include <stdio.h> int main() { int n, m, present; while (scanf("%d", &n) && n) { present = 0; while (n--) { scanf("%d", &m); present ^= m; } printf("%d\n", present); } return 0; }
刚开始做的时候用的是开数组的方法,因为英语不好,理解成你的礼物的号码是唯一的。结果内存”超标“,计算错误。当成教训吧,代码如下:
#include <stdio.h> int present[1000010]; int main() { int n, i, j, ok; while (scanf("%d", &n) && n) { for (i=0; i<n; i++) //输入数据 scanf("%d", &present[i]); for (i=0; i<n; i++) { ok = 0; //present[i]与其他present相同的个数 for (j=0; j<n; j++) { if (present[i] == present[j]) { ok++; if (ok > 1) //如果相同超过2个,提前结束 break; } } if (ok == 1) //如果找到自己的present,结束循环 break; } printf("%d\n", present[i]); } return 0; }