1. 程式人生 > >c語言 尋找一個由成對元素組成的陣列中的不成對元素

c語言 尋找一個由成對元素組成的陣列中的不成對元素

       在一個數組中有很多對的元素,相互成對出現,而有2個元素則是不成對出現,要找到這兩個元素,並將其列印在螢幕上,需要用到位運算和運算子的應用。

       例如{1,2,3,1,2,3,5,8},這一組元素中, 5 , 8  這兩個元素不是成對出現的,我們的目的就是找出這兩個元素。整個思路就是先進性陣列中所有元素的異或運算,然後將所得的數 &1,找出異或後出現 1 的那一位,這時,i 的值因為如果就是該位的位數,然後在進行兩個元素的分離(如果兩個元素不同,則至少有一位兩者不同,而兩者不同時肯定是一個為1,一個為0),找出兩個不同的數,最後再將兩個元素的地址分別賦給另外兩個提前準備好的地址中去,由內部函式變數值的地址的改變來改變外部函式變數的值,從而找出這兩個元素。

#include<stdio.h>
void* diff(int* arr,int as,int *px, int *py)
{
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < as; i++)
	{
		num ^=arr[i];
	}
	for (i = 0; i < 32; i++)
	{
		if (((num >> i) & 1) == 1)
		{
			j = i;
			break;
		}
	}
	for (i = 0; i < as; i++)
	{
		if (((arr[i] >> j) & 1) == 1)
		{
			*px ^= arr[i];
		}
		else
		{
			*py ^= arr[i];
		}
	}
}
int main()
{
	int arr[] = { 1, 2, 3, 5, 1, 2, 3,8};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int a = 0;
	int b = 0;
	diff(arr, sz, &a, &b);
	printf("%d %d", a, b);
	system("pause");
	return 0;
}