整理自csdn论坛里的一个帖子!
有两个文件A,B。
A文件中存储了N个整形数(N可能很大,里面的数可以重复)。
B文件比A文件少了一个数,其他的全部相同,但顺序不一样。
设计一个方法,判断B文件中比A文件少了哪个数。
思路: int A = A1^A2^A3^...^An
int B = B1^B2^B3...^Bn-1;
那么所求的那个数
int c= A^B.
程序:
#include <stdio.h>
void main()
{
int A[]={1,2,3,4,5,6,7,8,9,10 ,9,8,7,6,5,4,3,2,1};
int B[]={1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,9};
int x = 0;
for( int i=0;i<19;++i)
{
x ^= A[i];
}
for( int j=0;j<18;++j)
{
x ^=B[j];
}
printf("%d/n",x);
}
异或还可用来交换两个整数的值时不用第三个参数.
如a=11,b=9.以下是二进制
a=a^b=1011^1001=0010;
b=b^a=1001^0010=1011;
a=a^b=0010^1011=1001;
这样一来a=9,b=11了。
比较下题:
1~1001放在1000大小的数组里,然后判断哪个数没有存进去。
思路:因为该题的数字较小,不考虑溢出,可分别求和将1+2+.....+1001=sum1, a[0]+a[1]+......+a[999]=sum2;然后相减求差,sum1-sum2的结果就是没有存进去的数.由于上题的数字可能很大需要考虑溢出问题,所以用异或法最优.