【C语言---32】查找数组的不成对出现的两个数(简化写法)

思路分析:

先对数组进行一次异或运算,得到两个单独出现的数字异或之后的结果

10 1010
12 1100

异或之后得到6 0110

两个1代表它们的这两位分别不同

根据这一位上的数字不同可以将数组分成两组,一组为这一位数字为1,另一组为这一位数字为0

分别对这两组数字进行异或运算就可以得到两个单独出现的数字

代码示例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	 int arr[10] = { 8, 12, 10, 11, 9, 11, 9, 2, 2, 8 };
	 int i, sum=0;
	 for (i = 0; i < 10; ++i)  //查找单独不配对的数的写法
	 {
		  sum ^= arr[i];
	 }
	 //printf("%d ", sum);
	 //printf("%d \n", 10 ^ 12);

	 int a;// 用来记录哪一位是1
	 int num1 = 0;
	 int num2 = 0; 
	 for (i = 0; i < 32; ++i)
	 {
		  if (sum & 1 << i)    //在sum里面找每一位 看是否为1,如果是1,记录位置
		  {
			   a = i;
			   break;
		  }
	 }
	 for (i = 0; i < 10; ++i)
	 {
		  if (arr[i] & 1 << a) //在数组中查找那一位为1的数归为一组,不为1的为一组
		  {
			   num1 ^= arr[i];//对两组数分别异或就可以找出两组数种单独出现的一个
		  }
		  else
		  {
			   num2 ^= arr[i];
		  }
	 }
	 printf("%d %d ", num1, num2);
	 system("pause");
	 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值