一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
头文件以及主函数(测试):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[] = { 4, 6, 4, 5, 5, 3, 6 }; //数组初始化,可自由赋值
int len = sizeof(arr) / sizeof(arr[0]),c; //求数组长度
c = find_f(arr, len); //函数调用
if (c > len) //判断返回值是否合法
printf("这组数中没有单独的数\n");
else
printf("%d\n",arr[c]); //合法即输出单独的数
system("pause");
return 0;
}
方法一:直接比较法(比较笨),每一个数都和其余的数比较,直到找出单独的
int find_f(int arr[], int len) //寻找单独数
{
int i, j, k;
for (i = 0; i < len; i++)
{
k = 0;
for (j = 0; j < len; j++)
{
if ((arr[i] & arr[j]) == arr[i]) //如果两数相同,k++
k++;
}
if (k == 1) return (i); // 如果(k=1),即本数组中只有自己一个,则返回此数的下标
}
return (len + 1);
}
方法二:按位异或,设处置为0;0异或任何数都为任何数;
int find_f(int arr[], int len) //寻找单独数
{
int temp = 0;
for (int i = 0; i < len; i++)
{
temp = temp^arr[i]; //按位异或
}
for (int i = 0; i < len; i++)
{
if (temp == arr[i])
return i;
}
return len+1;
}
本文只是在下在学习过程自己的想法,只能实现简单功能,可能还没考虑到程序的优化,与大神写出来的代码还有一定差距,如果那位大神发现了问题,请您不吝赐教,如果您还有更好的方法,不妨分享分享,谢谢!
本文出自 “分享中进步” 博客,请务必保留此出处http://xmwen1.blog.51cto.com/10730069/1706070