zoukankan      html  css  js  c++  java
  • 博士的难题

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

    题目描述

    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");



  • 相关阅读:
    [LeetCode] 771. Jewels and Stones
    [LeetCode] 129. Sum Root to Leaf Numbers
    java定时器demo
    Spring Boot与监控管理
    springboot与热部署
    springboot中的web项目不能访问templates中的静态资源
    @Component 和 @Bean 的区别
    springcluoud入门
    Dubbo和Zookerper的关系
    Spring boot配置Dubbo三种方式
  • 原文地址:https://www.cnblogs.com/jiamian/p/10633978.html
Copyright © 2011-2022 走看看