今天见了一道有意思的题,想了几种方案都被否定,没法好的实现,最后找到一种解法,属于我的盲区,发现了新大陆:神奇的异或,寻找独一无二的数
题目描述
Mr.王博士制造了n种机器人,有一天他又发明了一种复制药水,可以把每个机器人再复制一遍,得到一个相同的机器人,于是,在一个风和日丽的上午,他把n个机器人拿出来,将一大桶复制药水泼向所有的机器人,瞬间每一个机器人就变成了两个相同的机器人,可是,有一个编号为x的机器人,他想做独一无二的机器人,不想被复制,于是,它灵活地躲开了所有的药水。王博士知道后很生气,想要找出这个机器人,可是这些机器人外表都差不多,唯一可以辨认的就是它们的编号,每一种机器人的编号是不一样的,复制出来的机器人编号和原来的是一样的,你能帮助博士找出这个机器人吗?
输入
有多组数据.每一组数据第一行给出机器人的种数n,第二行有2*n-1个数字,表示复制出来的机器人的编号,编号没有顺序。
输出
对于每一组数据,答案输出一行,为要找的机器人的编号
数据范围 n大于等于1且小于100000,机器人的编号大于等于0且小于2^31,保证不同种类的机器人编号不一样,且只有一个机器人的编号只出现一次。
样例输入
3 1 1 3 2 2 2 1 2 1
样例输出
3 2
代码如下:
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 int judge(int n,int num[]) 7 { 8 int result = num[0]; 9 if (n == 1) return result; 10 for (int i = 1; i < 2*n-1; i++) 11 result ^= num[i]; //^=是C/C++的一个符合运算符。表示异或赋值 异或就是两个数的二进制形式,按位对比,相同取0,不同取一 12 return result; 13 } 14 int main() 15 { 16 int n; 17 while (cin>>n) 18 { 19 int *num = new int[2 * n - 1];//给int型指针num分配2*n-1个空间 20 for (int i = 0; i < 2 * n - 1; i++) 21 cin >> num[i]; 22 cout << judge(n, num) << endl; 23 } 24 return 0; 25 }
下面是拓展内容
异或门符号'^',在编程中的使用,有的时候能够让你的程序更加精炼简捷,
尤其在C++的acm程序应用中,可以避免许多麻烦!!!它的几个简单作用
讲解如下:
它的简单规则是相同为0,不同为1,例如
int a=3=011(2进制,在计算机中的存储形式);
int b=6=110(2进制,在计算机中的存储形式);
int c=a^b=101=5;
切忌,在异或门的计算中都是应用的2进制!!
任何数和0异或都等于它本身;两个相同的数异或后的结果是0;
1)实现两个数的交换
a=a^b;
b=a^b;//b=a^b^b=a^0=a;
a=a^b;//a=a^a^b=0^b=b;
应用例子如下:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a=3; 6 int b=4; 7 a=a^b; 8 b=a^b; 9 a=a^b; 10 cout<<a<<' '<<b<<endl; 11 return 0; 12 }
2.在一排数中找到独一无二的一个数
例子如下:
他的思路是;
只要有相同的数那么他们异或后的结果就是0,最后就剩下0和那个独一无二的数相异或,就等于
那个独一无二的数了!!哈哈!!例子,如下:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n,i,x,y; 6 while(scanf("%d",&n)!=EOF&&n) 7 { 8 x=0; 9 while(n--) 10 { 11 cin>>y; 12 x^=y; 13 } 14 printf("%d ",x); 15 } 16 return 0; 17 }
随便输入几个数,找到其中没有和他相同的那个数!
3)判断两个数是否相等
1 if(a^b==0) 2 printf("a=b"); 3 else 4 printf("a!=b");