题目描述
输入一个长度为n的数组,所有的数字均不相同,有且只有一个数字出现了奇数次。
比如对于1 2 3 1 2 3 1,我们考虑所有不同的数字1 2 3,有且只有1出现了奇数次(3次)
输出这个出现了奇数次的数字。
输入
第一行一个整数n(1<=n<=100000)
接下来一行n个整数,表示输入的数字ai(1<=ai<=10^9)。
输出
一个数字,表示出现了奇数次的数字。
输入样例 复制
7 1 2 3 1 2 3 1
输出样例 复制
1
进攻知识点:
一、二进制转十进制
方法一
小数点前或者整数要从右到左用二进制的每个数去乘以2的相应次方并递增,小数点后则是从左往右乘以二的相应负次方并递减。
例如:二进制数1101.01转化成十进制
1101.01(2)=120+0*21+122+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25(10)
所以总结起来通用公式为:
abcd.efg(2)=d20+c*21+b22+a*23+e2-1+f*2-2+g2^-3(10) *
**方法二
或者用下面这种方法:
把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
2的0次方是1(任何数的0次方都是1,0的0次方无意义)
2的1次方是2
2的2次方是4
2的3次方是8
2的4次方是16
2的5次方是32
2的6次方是64
2的7次方是128
2的8次方是256
2的9次方是512
2的10次方是1024
2的11次方是2048
2的12次方是4096
2的13次方是8192
2的14次方是16384
2的15次方是32768
2的16次方是65536
2的17次方是131072
2的18次方是262144
2的19次方是524288
2的20次方是1048576
即:
2的次方
此时,1101=8+4+0+1=13
再比如:二进制数100011转成十进制数可以看作这样:
数字中共有三个1 即第六位一个,第二位一个,第一位一个(从右到左),然后对应十进制数即2的0次方+2的1次方+2的5次方, 即 100011=32+0+0+0+2+1=35
二、十进制转二进制:
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
十进制整数转二进制
如:255=(11111111)B
255/2=127=余1
127/2=63余1
63/2=31=余1
31/2=15=余1
15/2=7余1
7/2=3=余1
3/2=1=余1
1/2=0===余1
789=1100010101(B)
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2=0 余1 第1位
注意注意:记得二进制短除法余的倒序!!!!
三、按位异或:
数学符号 :xor
C++符号:^
#include<bits/stdc++.h>
using namespace std;
long long a[100000],n,b;
int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
{
cin>>a[i];
b^=a[i];
}
cout<<b<<endl;
return 0;
}