练习题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