1. 程式人生 > >C語言實現:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。

C語言實現:一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。

思路:異或陣列中的每一個數,最終出現的結果是兩個只出現一次數字的異或結果,,因為兩個陣列不一樣,所以異或結果不為0,二進位制結果有一個是1.在結果中找到第一個為1的位置,記為n,然後陣列右移n位,為1,為0,分別輸出兩個數

#include <stdio.h>
#include<Windows.h>
int two(int n)
{
	int c = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			return c;
		}
		c++;
		n /= 2;
	}
	return -1;
}
void find_two(int*a, int size,int *p,int *q)
{
	int find = 0;
	int ret = 0;
	for (int i = 0; i < size; ++i)
	{
		find ^= a[i];
	}
	ret = two(find);
	for (int i = 0; i < size; ++i)
	{
		if (1 & (a[i] >> ret))
		{
			*p ^= a[i];
		}
		else
		{
			*q ^= a[i];
		}
	}
}
int main()
{
	int a[8] = { 1,1,3,3,4,5,6,6 };
	int size = sizeof(a) / sizeof(a[0]);
	int p = 0;
	int q = 0;
	find_two(a, size,&p,&q);
		printf("%d,%d\n", p,q);
	system("pause");
	return 0;
}