cpp-熟能生巧-学习代码(1)

4 篇文章 0 订阅

题解图片

/*
异或(不进位加法):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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值