zoukankan      html  css  js  c++  java
  • 数组中只出现一次的数字——位运算

    http://ac.jobdu.com/problem.php?cid=1039&pid=22

    一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

    问题1:如果是寻找只有一个出现一次的数字,比较简单的,只要所有数字异或一次即可

    问题2:找出这两个只出现一次的数字,就要将所有的数字分成两堆,每堆个包含一个出现一次的数字:先把所有数字异或下得到一个数A,A的二进制中的某一位为1,这时就可以以所有数二进制某一位是否为1分成两堆,这是回到了问题一

    View Code
    #include<stdio.h>
    
    int a[1000009];
    int b[1000009],c[1000009];
    
    template <class T>  
    inline void scan_d(T &ret) {  
        char c; ret=0;  
        while((c=getchar())<'0'||c>'9');  
        while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();  
    }
    
    int main()
    {
        
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            int i;
            for(i=1;i<=n;++i){
                scan_d(a[i]);
            }
    
            int left=a[1];
            for(i=2;i<=n;++i){
                left=left^a[i];
            }
    
            int addl=0,addr=0,add=0;
            while(((1<<add)&left)==0) ++add;;
            int temp=1<<add;
    
            for(i=1;i<=n;i++){
                if(a[i]&temp){++addl;
                    b[addl]=a[i];
                }
                else{++addr;
                    c[addr]=a[i];
                }
            }
    
            int min=b[1],max=c[1];
            for(i=2;i<=addl;++i){
                min=min^b[i];
            }
            for(i=2;i<=addr;++i){
                max=max^c[i];
            }
    
            if(min>max){
                temp=max;max=min;min=temp;
            }
            printf("%d %d\n",min,max);
        }
    
        return 0;
    }

    再输入加速,排到了第二

  • 相关阅读:
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    计算与软件工程 作业六
    计算与软件工程 作业五
    计算与软件工程 作业四
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    第六次作业
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2858861.html
Copyright © 2011-2022 走看看