找出两个单身狗(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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值