其他分享
首页 > 其他分享> > 练习题2

练习题2

作者:互联网

有101个整数,其中50个数出现了两次,一个数出现了一次,找出出现了一次的那个数

话不多说,上代码

#include<stdio.h>
#define N 7
int main()
{
	int a[N];
	int i;
	int t=0;
	for(i=0; i<N; i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0; i<N; i++)
	{
		t=t^a[i];
	}
	printf("%d\n",t);
	return 0;
}

我这里只定义了七个数,一百多个数都是适用的,只要改一下N的值就成,思路很简单,利用异或,任何数跟自己异或得到的数都是0,任何数与0异或得到的数就是自己.根据这个,我们可以把所有数进行异或运算,最终得到的数就是那个只出现一次的那个数.

有102个整数,其中有50个数出现了两次,2个数出现了一次, 找出出现了一次的那2个数

话不多说,上代码

#include<stdio.h>
#define N 6
int main()
{
	int a[N];
	int i;
	int result;
	int obj1,obj2;
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<N;i++)
	{
		result=result^a[i];
	}//得出所有数据的异或结果
	result=result&(-1*result);
	for(i=0;i<N;i++)
	{
		if(a[i]&result)
		{
			obj1=obj1^a[i];		
	    }else obj2=obj2^a[i];
	}
	printf("%d %d",obj1,obj2);
	return 0;
}

这道题思维上有一点难度,不是仅仅就进行异或运算,我们要想到先把所有数进行异或运算,得到的结果就是那两个只出现过一次的数的异或结果,我们需要找到他们两个异或得到的那个数最低位为1的那个数,因为出现一次的那两个数这一位一定不同,这个是有公式的,假设异或结果是t,则那个数就是t=t&(-1*t),然后我们拿该数与所有数按位与,为1的放一堆,为0的放一堆,就能将两个出现过一次的数分开,然后对两堆各自异或,就能找到出现一次的两个数.

标签:练习题,那个,一次,int,个数,异或,出现
来源: https://www.cnblogs.com/buxiu888/p/14093847.html