zoukankan      html  css  js  c++  java
  • C语言编程 找出数列中只出现一次的两个数

    原题:
    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
    找出这两个只出现一次的数字,编程实现。

    此题要用到在数列中找出只出现一次的一个数字的方法
    参考https://blog.51cto.com/14232799/2382172

    此题明显无法一次性将两个数都找出,所以需要将数列分为两部分,每一部分有一个只出现一次的数,那么此时需要的就是分离数列的条件。

    沿用找出一个数时的思想,将数列进行相互异或,但这次所得的值不是只出现一次的那个数了,因为只出现一次的数有两个,所以此次计算得到的是只出现一次的两个数的异或值。

    在得到这个值后进行分析,假如得到值是4,二进制码是0100
    参照异或的定义,0代表此位两个数的值相同,1代表此位两个数的值不同。
    eg:
    只出现一次的两个数是2和6
    2的二进制码是
    0010
    6的是
    0110
    计算得到的值(两个数异或)就是0100,表示第三个二进制位两个数不同

    得到了此条件,就可以将数列分为第三个二进制位为1第三个二进制位为0两个数列
    再将每个数列采用找出一个数字的方法找出数字即可。

    源代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    
    int Find1(int a[],int length)
    {
        int result=0,i;
        for (i = 0; i < length; i++)
        {
            result^= a[i];
        }
        return result;
    }
    void Find2(int result,int a[], int length, int *k1, int *k2)
    {
        int i=0,j;
        while (((result >> i) & 1) != 1)
        {
            i++;
        }
        for (j = 0; j < length; j++)
        {
            if (((a[j] >> i )& 1 )== 1)
            {
                * k1 ^= a[j];
            }
            if (((a[j] >> i) & 1 )== 0)
            {
                * k2 ^= a[j];
            }
        }
    }
    int main()
    {
        int arr[] = { 1, 3, 5, 7, 1, 3, 5, 9 };
        int length = sizeof(arr) / sizeof(arr[0]);
        int num1=0, num2=0;
        int * k1 = &num1, * k2 = &num2;
        Find2(Find1(arr, length), arr, length, k1, k2);
        printf("%d %d
    ",num1,num2);
        system("pause");
        return 0;
    }
  • 相关阅读:
    利用模板实现c++智能指针
    movit 相关函数(二)
    moveit相关函数解释
    ros常用函数(1)
    Qtcreator中cin函数无法在application output中进行输入的问题的解决
    c++速成,适合有c基础的朋友(3)
    【重要通知】本博客不再更新,更多教程请访问 makermaker.cc
    BBC micro:bit 学习资源汇总(最近更新2019年1月6日....)
    [20个项目学会BBC micro:bit编程] 20-无线通信
    [20个项目学会BBC micro:bit编程] 19-直流电机控制
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756245.html
Copyright © 2011-2022 走看看