首页 > 学院 > 开发设计 > 正文

c::求数组中的异数~

2019-11-14 10:27:50
字体:
来源:转载
供稿:网友

函数说明:

1)一个数组中有一个数出现了一次,其余的数字出现了两次。

思路分析:

 A: 首先可能会想到的办法是:再建一个数组,进行数组的遍历,遇到相同的数,就放到新的数组中,最终剩下的就是异数。

 B:但是上面的这种办法会有开空间的开销,所以我们想到另外一种办法:利用异或,我们知道异或就是相同的数异或为零,针对此题,最终异或下来的数就是异数。

#include<stdio.h>int main(){	int a[9] = {1,1,2,3,4,3,4,5,5};	int ret = 0;	int i = 0;	for(i = 0; i<9; i++)	{		ret ^= a[i];	}	PRintf("%d/n",ret);	return 0;}

2)一个数组中有两个数出现了一次,其余的数字出现了两次。

思路分析:

第一步:将所有的数字异或,得到结果是不同数字的异或结果第二步:找上部结果中此数任意位置是1的,记录此位置第三步:找原数组中在此位置是1的数第四步:将你刚开始设置的变量为0的与是第三步中的数异或, 得到一个不同的数

第五步:将原来两个数异或的结果与第四步中得到的不同数异或,得到另一个不同数

#include<stdio.h>void Find(int a[],int len,int *p1,int *p2){	int i = 0;	int res = 0;	int pos = 0; //记录二进制位位1的位置	for(i = 0; i<len; i++)  //将所有数进行异或	{		res^=a[i];	}	for(i = 0; i<32; i++)   //找二进制位中任何位置是1的并记录	{		if(((res>>i)&1) == 1)		{			pos = i;			break;		}	}	for(i = 0; i<len; i++)	{		if(((a[i]>>pos) &1) ==1)		{			(*p1)^=a[i];					}	}	*p2 = res^(*p1);	}int main(){	int a[10] = {1,1,2,4,4,5,5,3,6,6};	int len = sizeof(a)/sizeof(a[0]);	int *ret1 = 0;	int *ret2 = 0;	Find(a,len,&ret1,&ret2);	printf("%d/n",ret1);	printf("%d/n",ret2);	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表