wuheqian 发表于 2022-10-29 22:22:41

找礼物

在一次实验室聚会上,学长发送x(奇数)个礼物,并且标出了编号。每个人都得到了学长的礼物,学长在其中一个礼物里面设置了大奖,除了大奖编号只出现一次以外。其余每个编号均出现两次,
现在给你所有人拿到的礼物编号,你能找到这个大奖礼物的编号吗?

柿子饼同学 发表于 2022-10-29 22:41:33

#include <bits/stdc++.h>
using namespace std;

int ans, temp, n;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i = 0; i < n; i++){
      cin >> temp;
      ans ^= temp;
    }

    cout << ans ;

    return 0;
}
异或 (^) 的性质 :a ^ b ^ a = b
a ^ b ^ b = a
就是一个数异或两次另一个数 , 结果还等于原数 , 可以利用这个性质做

wuheqian 发表于 2022-10-29 22:48:58

柿子饼同学 发表于 2022-10-29 22:41
异或 (^) 的性质 :a ^ b ^ a = b
a ^ b ^ b = a
就是一个数异或两次另一个数 , 结果还等于原数 , 可 ...

可以详细讲下思路吗?
代码有点看不懂

柿子饼同学 发表于 2022-10-29 23:00:40

wuheqian 发表于 2022-10-29 22:48
可以详细讲下思路吗?
代码有点看不懂

就只用了异或啊
n 就是 n 个礼物 , ans 就是最终中奖的那个答案 , temp 就是每次读入的编号
由于一个数异或两次另一个数结果等于原数 , 异或一次就等于异或的数
因此每次读进 temp 把它和 ans 相异或
因为只有一个只出现一次的数 , 所以那些出现两次的相互抵消 , 最后只剩下那个中奖的数
页: [1]
查看完整版本: 找礼物