hdu2095异或问题

来源:互联网 发布:最小公倍数求法 c语言 编辑:程序博客网 时间:2024/05/24 15:39
异或,英文为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