C语言详解系列——循环语句的练习与巩固,二分查找的讲解

前言

在我们之前的学习分享当中,向大家详细的介绍了C语言中的循环语句,那么我们仅仅是了解他们的用法还不够,我们需要自己动手写代码,去练习和熟悉知识,那么今天我就与大家一起练习以下

题目

在一个有序数组当中查找具体的某个数字n

首先我们拿到题目进行需求分析,题目让我们在有序数组当中查找某一个数,那我们可以如何查找,从数组的第一个元素开始一直向后直到找到那个数字n或找到数组最后一个数也没有找到,这样是否太过繁琐了,有没有更方便一点的找法可以简化我们的查询步骤,这里我们向大家介绍一种算法叫做二分查找(折半查找)。

二分查找:
假设数组为升序,二分查找就是每一次用数组最中间的元素与待查找元素n进行比较,如果中间元素比n小,那么我们将舍弃后半部分用前半部分的中间元素在与n比较,如果中间元素比n大,那么我们舍弃后半部分,在用前半部分的中间元素与n比较,反复循环,直到找到元素。

我们看到上面的思路,每查找一次,我们就会舍弃一半的数据,是不是查询起来比按次序比较快很多呢?如果上述描述没有理解我们用图来给大家演示一下。假设我们要在有10个元素的有序数组当中查找值为7的元素,我们可以使用二分查找,首先我们算出中间值,最左元素的下标和最右元素的下标之和除以二,就是中间元素的下标,第一次查找我们计算出来中间元素的下标为4,而在数组中下标4对应的值为5,他比我们要查询的7小,所以在他之前的所有元素都比7小,我们要舍弃他之前的所有元素所以我们的最左元素的下标就从0变成了5,第二次查找,我们继续找到中间元素,通过计算(5+9)/2我们算出来第二次查找中间元素的下标为7,对应元素值为8,比待查找元素大,所以在他之后的所以元素都要舍弃,我们把最右元素从9变成了6。之后循环进行上述操作直到找到带查找元素,或者但左值大于右值时,查询失败。
在这里插入图片描述

通过上述的分析我们大概了解了这个算法的思路,那么如何在代码中实现呢?我来个大家思路,因为我们要循环操作,所以我们肯定要用循环语句来实现,在循环语句内要实现的功能有,找到中间值并于待查值作比较,通过选择语句来进行判断要执行的功能,最后给出提示找到与否。代码如下:

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 7;//要查找的数

	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	

	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > n)
		{
			right = mid - 1;
		}
		else if (arr[mid] < n)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标为%d",mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到了!");
	}
	return 0;
}

这就是二分查找的基本算法,希望大家可以理解。

编写代码,演示多个字符从两端移动,向中间汇聚。

基本思路:我们需要有两组字符串,一组是我们需要输出的字符,一组是加密文,我们用待输出的字符串的首元素和尾元素依次替换掉加密文,替换一次输出一次,这样就可以达到题目所需的效果。代码如下:

//编写一个代码,演示多个字符从两端向中间移动
int main()
{
	char arr1[] = "welcom to bit!!!!";
	char arr2[] = "*****************";

	int left = 0;
	int right = strlen(arr1) - 1;

	while (left<=right) 
	{
		 
		 arr2[left] =  arr1[left];
		 arr2[right] = arr1[right];

		 printf("%s\n", arr2);

		 left++;
		 right--;
	}

	if (left > right)
	{
		printf("打印完成\n");
	}

	return 0;
}

编写代码实现,模拟用户登录情景,并且只能登录三次。

基本思路:我们需要输入密码,再把输入的密码与正确的密码进行比较,如果相同,登录成功,如果不相同,继续输入,循环最多执行三次,根据判断给出相应的提示。一下为代码演示:

//编写一个代码,模拟用户登录,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次都错登录失败)
int main()
{
	char password[] = "0";
	int i = 0;

	while (i < 3)
	{
		printf("请输入密码:\n");
		scanf("%s", password);
		i++;

		if (strcmp(password, "123456") == 0)
		{
			break;
		}
	}
	if (i == 3)
	{
		printf("你输入的密码有误,登录失败\n");
	}
	else
	{
		printf("恭喜你登录成功\n");
	}

	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值