hdu2095异或问题

异或,英文为exclusive OR,或缩写成xor
异或( xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。

C语言中异或的符号为^;

运算法则为

1、a^b = b^a。

2、(a^b)^c = a^(b^c)。

3、a^b^a = b。

对于一个任意一个数n,它有几个特殊的性质:

1、0^n = n。

2、n^n = 0。

所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。

¥¥¥¥¥¥¥¥¥几个数异或满足交换律。2^3^2=2^2^3=0^3=3.

所以,这道题用异或的方法来做就很简单了= =

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
    int n,x,ans,i;
    while(scanf("%d",&n),n!=0)
    {
        scanf("%d",&ans);
        for(i=1;i<n;i++)
        {
            scanf("%d",&x);
            ans^=x;
        }
        printf("%d\n",ans);
    }
    return 0;
}


如果实在不会异或的话,还可以用数组来做,只不过有点耗费空间和时间而已;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
 int a[1100000];
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int main()
{

    int i,n;
    while(scanf("%d",&n),n!=0)
    {
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        qsort(a,n,sizeof(a[0]),cmp);
        if(a[0]!=a[1])
            printf("%d\n",a[0]);
        else if(a[n-1]!=a[n-2])
            printf("%d\n",a[n-1]);
        else
            for(i=1; i<n-1; i++)
                if(a[i]!=a[i-1]&&a[i]!=a[i+1])
                    printf("%d\n",a[i]);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值