异或,英文为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;
}