基础数学问题 P1469 找筷子

题目

https://www.luogu.com.cn/problem/P1469

题目分析

在描述算法三之前先普及一下位运算。

|(或)两个二进制数的或运算,即两个数的某个相同的位置上有1为1

例如: 1000101 1001111 1001111即为两个数的或运算值(对于第1,4,5,6,7位上在两个数中找得到1)

注意:若两个数的位数不相同,少的那个数用0补齐

例如: 1000111 1000111 10011 运算可以看成 0010011这两个数来运算

感性理解:对于每个位置上1为显性基因

怎样区分|与&运算:|符号像1,即1为显性基因(即或运算) &(与)与|相反,0为显性基因,不理解的看上面的内容理解

^(异或)对于每个位置上进行不进位加法(进制为二进制),即1+1=0,1+0=1,0+0=0 然后

算法三:对于两个相同的数,他们异或值为0

证明:两个相同的数转化为二进制数必然也相同,上面已经说过,对于每位上的加法,无非就两种0+0,1+1值均为零 当我们把所有输入的数异或一遍,

是不是相同的数都齐齐殉情了,这就变成了0^那个多余的数,而某个数异或0得到的值还是它本身 即ans为所有数的异或值

参考:https://www.luogu.com.cn/blog/qjmm-qjmm/solution-p1469

代码

#include<iostream>
#include<algorithm>
using namespace std;
int list[10000002];
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int n,ans=0;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        ans ^= x;
    }
    cout << ans;
}

 

posted @ 2020-05-09 10:00  Jason66661010  阅读(190)  评论(0编辑  收藏  举报