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;
}

猜你喜欢

转载自blog.csdn.net/f_shell_x/article/details/81300906