杭电 find your present (2) (异或)

杭电 find your present (2) (异或)

题目描述(Problem Description)

在新年晚会上,每个人都会得到一份“特别的礼物”。现在轮到你去拿你的特别礼物了,桌上放了很多礼物,其中只有一件是你的。每件礼物上都有一个卡号,而你礼物的卡号将是与其他礼物不同的卡号,你可以假设只有一个数字出现奇数次。例如,有5个礼物,他们的卡号是1,2,3,2,1。所以你的礼物将是卡号为3的那一个,因为3是与所有其他数字不同的数字。

输入(Input)

输入文件将由几个案例组成。

首先,每个案例将由整数n(1<=n<1000000,n为奇数)表示。然后,在一行中给出n个正整数,所有整数都小于2^31。这些数字表示礼物的卡号。n=0结束输入。

输出(Output)

对于每种情况,在一行中输出一个整数,即您当前的卡号。

样本输入(Sample Input)

5
1 1 3 2 2
3
1 2 1
0

样本输出(Sample Output)

3
2

注:use scanf to avoid Time Limit Exceeded

题解

异或:将输入的所有整数异或,出现偶数次的整数会被抵消,最终输出的就是不重复的整数。
例如:输入[1 1 3 2 2],根据异或运算规则
(相同为0,相异为1)

1^1=0
0^0=0
1^0=0
0^1=0
0^N=N (N为任意整数)
N^N=0

1^1=0
0^3=3(把03转换成二进制再异或)
3^2=1
1^2=3

所以输出为3

代码(C++)

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int n,a,x=0;//x初始化为0,因为 0^N=N (N为任意整数)
    while(scanf("%d",&n),n) {
        while(n--) {
            scanf("%d",&a);
            x=x^a;//x用来存储输入的所有整数异或的结果
        }
        printf("%d\n",x);
        x=0;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值