C语言详解---找出一组数字中只出现一次的两个数字。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/gdarg/article/details/90737371

一个数组只有两个数字出现了一次,其他的数字成对出现,这里面用到的知识点是异或;
相同的数字之间异或的话最终的结果为0,所以讲整个数组进行异或的话,最终的结果就是那两个值出现一次的数字异或的结果,比如1 1 2 2 3 3 5 6,最终异或的结果就是5 ,6异或的结果。
下面附上代码。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void find_num(int arr[], int sz)
{
	int i = 0;//循环变量
	int pos = 0;//异或中第一个1的位置储存在里面
	int tmp = 0;//将整个数组异或的结果储存在里面
	int x = 0;//通过pos的分组,将第一组异或的结果储存在里面
	int y = 0;//将第二组异或的结果储存在里面
	for (i = 0; i < sz; i++)
	{
		tmp ^= arr[i];
	}
	for (i = 0; i < 32; i++)
	{
		if (1 == ((tmp >> i)&1))
		{
			pos = i;
			break;
		}
	}
	for (i = 0; i < sz; i++)
	{
		if (1 == ((arr[i] >> pos)&1))
		{
			x ^= arr[i];
		}
		else
		{
			y ^= arr[i];
		}
	}
	printf("x = %d, y = %d", x, y);
}

int main()
{
	int arr[] = { 1, 2, 3, 1, 2, 3, 6, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]); //求出数组的长度
	find_num(arr, sz);
	system("pause");
	return 0;
}

今天能做的事,绝不拖到明天——苏步青

猜你喜欢

转载自blog.csdn.net/gdarg/article/details/90737371