/*
异或(不进位加法):1+1=0 0+0=0 1+0=1
判断奇偶数 x^1=1 奇数 x^1=0 偶数
同求自己异或为0,同求0异或为自己 x^x=0、x^0=x
结合律、交换律、自反性 A^B^B=A^0=A
*/
/*
1-1000这1000个数放在含有1001个元素的数组中,
只有唯一的一个元素重复,其它均只出现一次。
每个数组元素只能访问一次,设计一个算法,将它找出来;
不用辅助空间,能否实现?
*/
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int main(){
int N=1001,x;
int arr[N];
for(int i=0;i<N-1;i++){
arr[i]=i+1;
}
srand((unsigned)time(NULL));
arr[N-1] = rand()%(N-1) + 1;
printf("重复的数是:%d\n",arr[N-1]);
int ans = 0;
for(int i=1;i<=N-1;i++) ans^=i;
for(int i=0;i<N;i++) ans^=arr[i];
printf("答案 :%d\n",ans);
return 0;
}
/*
这个题还有一个辅助空间的解法,就是新开一个辅助数组
扫描有重复的数组,数字对应的下标的值+1,最后扫描辅助数组输出数值为2的下标的值
*/
/*
如何产生一定范围的随机数呢?我们可以利用取模的方法:
int a = rand() % 10; //产生0~9的随机数,注意10会被整除
如果要规定上下限:
int a = rand() % 51 + 13; //产生13~63的随机数
分析:取模即取余,rand()%51+13我们可以看成两部分:
rand()%51是产生 0~50 的随机数,后面+13保证 a 最小只能是 13,最大就是 50+13=63
*/
/*
一个数组里除了某一个数字之外,其他的数字都出现了两次,
请写程序找出这个只出现一次的数字
*/
/*
A^A^B^C^C^D^D=B
同求本身异或为0,同求0异或为本身 A^A=0 A^0=A
*/
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int a[] = { 0,0,1,1,2,3,3 };
//printf("%d",sizeof(a));//28
//printf("%d",sizeof(a[0]));//4
int b = 0, i = 0, lenth = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < lenth; i++)
{
b = b ^ a[i];
}
cout << b;
return 0;
}