一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#include <stdio.h>
int main()
{
int a[]={1,2,3,4,1,2,3};
int i = 0;
int ret = 0;
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
ret^=a[i];
}
printf("%d\n",ret);
}
注意:a^a=0;
a^0=a;
基于以上
若一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现
void Findnum(int *a, int sz)
{
assert(a);
assert(sz > 2);
int i = 0;
int j = 0;
int temp= 0;
//整个数组进行异或
for (i = 0; i < sz; i++)
temp ^= a[i];
// 找第一个为1的位
int flag = 1;
for (i = 0; i < sizeof(int)*8; i++)
{
if (temp & (flag<<=i))//成立,比特为为1
{
break;
}
}
//按是否为1分为两个子数组
int n1 = 0;
int n2 = 0;
for (i = 0; i < sz; i++)
{
if (a[i] & flag)//a组
{
n1 ^= a[i];
}
else
{
n2 ^= a[i];//为1,b组
}
}
printf("只出现一次的两个数:%d %d\n", n1, n2);
}
int main()
{
int a[] = {2,3,4,5,2,4};
int sz = sizeof(a) / sizeof(a[0]);
Findnum(a, sz);
system("pause");
return 0;
}
此类内容主要是用位运算实现的哦!