#include
#include
int find_one_bit(int num) //约定寻找二进制中的某一位为1的位
{
int bit = 0;
while (num)
{
if (num & 1 == 1)
return bit;
bit++;
num = num >> 1;
}
return -1;
}
void find_num(int arr[], int size, int *p1, int *p2)
{
int tmp = 0;
int i = 0;
int pos = 0;
for (i = 0; i < size; i++)
{
tmp ^= arr[i]; //tmp保存的最终结果为不同的两个数字异或的结果
}
pos = find_one_bit(tmp);
for (i = 0; i < size; i++)
{
if (1 & (arr[i] >> pos)) //约定二进制位中同一位置是否为1,用以分组数字,因为某一位为1时,由异或的结果可知必定一个数字该位为0,另一个为1。0(0==*p1)与任何数字异或仍为该数本身。
*p1 ^= arr[i];
else
*p2 ^= arr[i];
}
}
//主函数
int main()
{
int arr[] = {1,2,3,4,5,1,2,6,3,4};
int size = sizeof(arr) / sizeof(arr[0]);
int num1 = 0;
int num2 = 0;
find_num(arr, size, &num1, &num2); //num1,num2必须传进地址,否则只是修改了形参而并不影响主函数的值,num1,num2仍为初始化的0。
printf("%d %d\n", num1, num2);
system("pause");
return 0;
}
本文题目:一个数组中只有俩个数出现了一次,其他都是成对出现的
文章源于:
http://cdxtjz.cn/article/jhpdpc.html