✨折半查找(二分查找)
在我们的日常生活中,给定一个场景,比如说你买了一个东西价格是98元,然后让你的朋友猜一下它的价格,你说,这个东西在150元以内,这个时候你的朋友会怎么猜呢?你的朋友肯定不会从1开始猜吧,他应该会给出比如说他会猜75元,然后你会说小了,让他再猜…
这个时候引入一个可以在有序数组中查找数字的方法,折半查找,也叫二分查找。
例: 在一个有序数组中查找具体的某个数字k。
分析:假设在1-10的数字中,找到7。因为它是有序数组,所以这个时候可以采用折半查找的办法,现在我们要找到7,创建一个整型数组arr,用1和10的下标相加除以二算出中间值mid的下标是4,也就是数字5,5<7,所以这个时候被查找的范围减少一半,新一次的查找范围就在5的右边,左边的值变成了mid+1,10还是最右边,第二次查找,中间值的下标是7,就是数字8,7<8,要查找的值在下标7的左边,这个时候只剩下下标是5和6的6和7,第三次求的中间值为下标6,第四次就剩下下标为6的数字7,mid=mid,就查到了。向每次查找都减少一半的方式就叫折半查找。
当左边的下标大于右边的下标时,说明查找不到。
答案:
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;//下标
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
注意:计算mid那一行一定要放在循环里头,因为mid每次查找都要重新计算。while的循环条件一定要写成left<=right,要不然就找不到了。还有这个地方计算mid,当数组里面的元素非常大的时候,left和right相加就有可能会溢出,这个时候可以用另一种方式计算,就是(right-left)/2+left。
✨模拟用户登录场景
题:模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
分析:首先密码可以输入三次,我们可以写一个循环来解决,如果循环终止就通过break来跳出循环。然后在循环里判断密码是否正确。如果输出三次均错误,就跳出循环。这里注意,比较两个字符串是否相等,不能直接使用==,而应该使用一个库函数:strcmp。使用该库函数需要包含头文件<string.h>。
程序代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char password[11] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
if (strcmp(password, "abcdef") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}
执行结果:
✨整活(关机程序)
关机程序:
1.电脑运行起来后,一分钟内关机。
2.如果输入:你是我的神,就取消关机。
在命令行窗口cmd中输入shutdown -s -t 60可以设置电脑在一分钟之后关机,输入shutdown -a取消关机。在程序中可以把shutdown -s -t 60和shutdown -a放入system函数中。
注:以下代码可适当娱乐🐶
#include<stdio.h>
#include<string.h>
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在60秒内关机,如果输入:你是我的神,就取消关机\n");//友好的提示doge
scanf("%s", input);
if (strcmp(input, "你是我的神") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
💫写在最后:这是我写的第一篇博客✌️,如果觉得写的还行的话,给一个三连支持以下叭👌,📣感谢!