编程实现:
一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。
#include <stdio.h>
void findnum(int * src, int n ,int* pnuml, int* pmun2)
{
int i;
int sum = 0;
for (i = 0; i < n; i++)
{
sum ^= src[i];//一个数连续异或两次不变,故可得只出现一次的这两个数的异或结果
}
int pos;//想通过pos找到只出现了一次的两数异或为1的位置
int num1 = 0, num2 = 0;
for (pos = 0; !(sum & 1 << pos); pos++);//1左移pos位和sum进行与操作
for (i = 0; i < n; i++)
{
if (src[i] & 1 << pos)//根据将数组元素分组,此时所找的两个数并不在同一组
{
num1 ^= src[i];//组内异或找只出现了一次的数
}
else
{
num2 ^= src[i];
}
}
*pnuml = num1;
*pmun2 = num2;//反赋值回去
}
int main()
{
int arr[] = { 5, 3, 9, 1, 7, 5, 4, 7, 4, 2, 9, 2 };
int num1, num2;
findnum(arr, sizeof(arr) / sizeof(arr[0]), &num1, &num2)
return 0;
}