栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言程序设计 | 单身狗题目讲解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言程序设计 | 单身狗题目讲解

  • 题目要求
  • 思路

题目要求

思路

第一种思路呢就是暴力求解。思路就不用多讲,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include 
void find_num(int* a, int num)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < num; i++)
	{
		int sum = 0;
		for (j = 0; j < num; j++)
		{
			//不与自己比较
			if (i != j)
			{
				//如果相同,则不是我们找的数字
				if (((a[i]) ^ (a[j])) == 0)
					;
				//否则可能是我们要找的数字
				else
					sum += 1;
			}
		}
		if (sum == num-1)
		{
			printf("%d ", a[i]);
		}
	}
}
void input_data(int* a, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &a[i]);
	}
}
int main()
{
	int a[100] = {0};
	int n = 0;
	scanf("%d", &n);
	input_data(a, n);
	find_num(a, n);
	return 0;
}

第二种就是应用C语言操作符异或来求得两个单身狗。

首先要知道的是两个相同的数异或得0,假设我们现在有这样的一个数组。

int arr[5]={1,2,3,1,2};

令这个数组从首元素开始遍历异或,1异或2,再异或3,再异或1,再异或2,得出的结果就是3,就能找出这样的一个单身狗。

整个流程如下图所示:

int main()
{
	int arr[5] = { 1,2,3,1,2 };
	int i = 0;
	int dog = 0;
	for (i = 0; i < 5; i++)
	{
		dog ^= arr[i];
	}
	printf("%d ", dog);
	return 0;
}

那么我们就知道在一个数组中找一个单身狗,就是通过异或来获得的,那么有两个单身狗怎么做呢?

假设现在有这么一个数组

int arr[6]={1,2,3,4,1,2};

在对整个数组异或之后可以得出结果是3^4

可以看到3的这个单身狗二进制的最后一位是1,

4的这个单身二进制的最后一位是0,那么我们就可以通过这个二进制位来对这个数组进行分组。

分成这样的两组:

然后再分别在这两个组中找出自己组的单身,例如组1找的单身狗是3,组2找的单身狗是4。所以代码就可以这样写:

#define _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	int arr[6] = { 1,2,3,4,1,2 };
	int ret = 0;
	int i = 0;
	int dog1 = 0;
	int dog2 = 0;
	//遍历异或整个数组,得出两个不同数异或的结果
	for (i = 0; i < 6; i++)
	{
		ret ^= arr[i];
	}
	//确定得出的结果最右边的1的位置
	int pos = 0;
	for (pos = 0; pos < 32; pos++)
	{
		if (((ret >> pos) & 1) == 1)
		{
			break;
		}
	}
	//分组
	for (i = 0; i < 6; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			dog1 ^= arr[i];
		}
		else
		{
			dog2 ^= arr[i];
		}
	}
	printf("%d %d ", dog1, dog2);
	return 0;
}

这里考察的是异或的运用,以及0异或任何数就得任何数的知识点(个人认为)。

这里的代码呢写得不是很高级,如果觉得写得不好可以提出批评。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号