找出两个单身狗(C语言)

知识点

1.先了解异或 ^ 的运算规律,两个数异或相同为0,相异为1。

2.根据异或的运算规律得到:0^a=a,a^a=0。

整体思路

1.先创建一个第三变量tmp,初始化为0;让tmp异或整个数组,最后得到的结果是两个单身狗异或的结果。

2.求出两个单身狗异或的结果的二进制第一位的数字,放到m里面。

3.最后分别把数组的每个元素的第一个二进制位分别异或m。

总体代码

void two_dog(int arr[], int len, int* x, int* y)
{
	int n = 0;
	for (int i = 0; i < len; i++)
	{
		n ^= arr[i];/* 两个单身狗的异或后存到n里面 */
	}

	int m = 0;
	for (int i = 0; i < 32; i++)
	{
		if (((n >> i) & 1) == 1)
		{
			m = i;
			break;
		}
	}

	/* 此时m的值为1 */
	for (int i = 0; i < len; i++)
	{
		if (((arr[i] >> m) & 1) == 1)
		{
			/* 1-0001  3-0011  5-0101 */
			*x ^= arr[i];
		}
		else
		{
            /* 2-0010  4-0100 6-1010 */
			*y ^= arr[i];
		}
	}
}




void test6()
{
	int x = 0;
	int y = 0;
	int arr[] = {1,2,3,4,5,1,2,3,4,6};
	int len = sizeof(arr) / sizeof(arr[0]);

	two_dog(arr,len,&x,&y);
	printf("%d,%d\n",x,y);
}


int main()
{
	//test1();//奇数再前,偶数再后
	//test2();//判断字符串2是不是字符串1旋转过后的字符.
	//test3();//计算器
	//test4();//杨氏矩阵
	//test5();//杨辉三角
	test6();//找两个单身狗

	return 0;
}

你可能感兴趣的:(c语言,算法,java)