注意:若数组总和为单数且执行两两匹配一定有单数
若数组总和为双数则先求最大奇数组的单数与最后一个元素比较,若不同则有两个单数,若相同则没有单数
如{ 1, 3, 5, 7, 1, 3, 5}显示单数为7 ;
{ 1, 3, 5, 7, 1, 3, 5,7}显示没有单数;
{ 1, 3, 5, 7, 1, 3, 5,8}显示单数为7,8 。
#include<stdio.h>
int main()
{
int a[] = { 1, 3, 5, 7, 1, 3, 5,7};
int i = 0;
int flag = 0;
int len = sizeof(a) / sizeof(a[0]);
int count = 0;
if (!(len % 2))
{
flag++;
}
for (i = 1; i < len-flag; i++)
{
a[0] = a[0] ^ a[i];
}
if (a[0] == a[len-1])
{
printf("没有单数\n");
count++;
}
if (!count)
{
if (flag)
{
printf("这个单数是:%d,%d\n", a[0], a[len - 1]);
}
else
printf("这个单数是:%d\n",a[0]);
}
return 0;
}
以下为执行异或的过程
find
a[i] i=0,1,2...7。
0000
0001
0001
0011
0010
0101
0111
0111
0000
0001
0001
0011
0010
0101
0111
1000
返回值
1111