博士的难题

Posted jiamian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博士的难题相关的知识,希望对你有一定的参考价值。

今天见了一道有意思的题,想了几种方案都被否定,没法好的实现,最后找到一种解法,属于我的盲区,发现了新大陆:神奇的异或,寻找独一无二的数

 

 

题目描述

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\n",x);            
15     }
16     return 0;
17 }

 


随便输入几个数,找到其中没有和他相同的那个数!


3)判断两个数是否相等

1 if(a^b==0)
2 printf("a=b");
3 else 
4 printf("a!=b");

 



以上是关于博士的难题的主要内容,如果未能解决你的问题,请参考以下文章

北大数学天才“韦神”上热搜,随手帮6个博士解决困扰4个月的难题

北大数学天才“韦神”上热搜,随手帮6个博士解决困扰4个月的难题

北大数学天才“韦神”上热搜,随手帮6个博士解决困扰4个月的难题

北大数学天才“韦神”上热搜,随手帮6个博士解决困扰4个月的难题

北大数学韦神又热搜了!随手帮6个博士解决难题:困扰4个月,韦神仅用一天...

北大数学韦神又热搜了!随手帮6个博士解决难题:困扰4个月,韦神仅用一天...