.编程实现:(拓展)一组数据中有两个数字出现了一次.其他所有数字都是成对出现的. 请找出这两个数字.(使用位运算)

#include <stdio.h>
#include <stdlib.h>
int main(){
	int arr[10] = { 1, 2, 3, 4, 5, 6, 4, 3, 2, 1 };
	int ret = 0;
	for (int i = 0; i < 10; ++i){
		ret = ret ^ arr[i];	//这样遍历并按位与之后其实得到的是这个数组中出现一次的两个数按位与的结果
	}
	int pos;
	for (int i = 0; i < 32; ++i){
		if (ret & (1 << i)){	//在这个结果中找到2进制的1
		//这一步目的是在二进制位下找到这两个数首次出现的不同位,因为ret是两个数按位与的结果,也就是说在二进制位下,如果这两个数各自的操作数不同的话就能得到1.
			pos = i;	//记下产生不同的位置
			break;
		}
	}
	int num1 = 0, num2 = 0;	
	for (int i = 0; i < 10; ++i){
		//将数组中的数按照上面记录的位置分为两类,即与发生不同位置操作数相同的分为一类,不同分为一类.再分别在各自的类里与0按位与,也就是回到之前只考虑数组中仅有一个数字不是成对出现的情况.
		if (arr[i] & (1 << pos)){
			num1 = num1 ^ arr[i];
		}
		else {
			num2 = num2 ^ arr[i];
		}
	}
	printf("%d %d",num1,num2);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/89421628
今日推荐