C语言初阶--折半查找算法

目录

练习1:在一个有序数组中查找具体的某个数字n

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

 练习3:简单编写代码实现,模拟用户登录情景,并且只能登录三次

练习4:猜数字游戏实现

总结


练习1:在一个有序数组中查找具体的某个数字n

//在一个有序数组中查找具体的某个数字n
#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 7;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){if (arr[i] == k){printf("找到了,下标是:%d\n", i);break;}}if (i == sz){printf("找不到\n");}return 0;
}
//找到了,下标是:6

使用折半或二分查找算法(不考虑溢出):在一个有序数组中查找具体的某个数字n

//使用折半或二分查找算法(不考虑溢出)
//在一个有序数组中查找具体的某个数字n#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 7;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int left = 0; //最左边元素下标int right = sz - 1; //最右边元素下标while (left <= right){int mid = (left+right) / 2; //中间元素下标,此处不考虑溢出//若考虑溢出,则使用下面一行代码保证不越界//int mid = left + (right-left) / 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;
}
//若考虑溢出,则使用下面一行代码保证不越界
int mid = left + (right-left) / 2;

 二分法可以改为函数的方法。直接进行调用,如下:

练习:写一个函数,实现一个整型有序数组的二分查找

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

//编写代码,演示多个字符从两端移动,向中间汇聚
//welcome to china!!!!
//####################
//w##################!
//we################!!
//wel##############!!!
//···
//welcome to china!!!!//理解下面两种求数组元素个数的思路
char buf[] ="abc"; 
//[a b c \0]
// 0 1 2 3
int right = strlen(buf) - 1; //strlen(buf)求的字符串长度为3,它计算的是\0前面的元素个数
int right = sizeof(buf) / sizeof(buf[0]) - 2; //sizeof(buf) / sizeof(buf[0])求的数组元素为4   
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>int main()
{char arr1[] = "welcome to china!!!!";char arr2[] = "####################";int left = 0;int right = strlen(arr2) - 1; //前面已经解释,或int right = sizeof(arr1) / sizeof(arr1[0]) - 2;while (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);Sleep(1000); //为了更好的观察打印流程,使用windows下面的Sleep函数睡眠1000毫秒,需引入头文件windows.h。1000毫秒=1秒//windows下面的cmd窗口使用cls命令,清空屏幕,每次观察一行打印流程system("cls"); //system是一个库函数,执行系统命令cls,需引入头文件stdlib.hleft++;right--;}//前面每次打印后都清理了屏幕,最后的打印结果也被清空,可再次执行打印printf("%s\n", arr2);return 0;
}

我运行清屏cls会导致程序运行的结果不是我想要的,编译器也未报错,百度查了暂时未找到问题。只找到大概的问题是因为清屏这段代码,这里我暂且先注释掉吧,要是有大佬可以指出错误点在哪。

 私下问了许多大佬,原因:我自己的编译器不支持

#include <stdio.h>
#include <windows.h>int main()
{char arr1[] = "welcome to china!!!!";char arr2[] = "####################";int left = 0;int right = strlen(arr2) - 1; //前面已经解释,或int right = sizeof(arr1) / sizeof(arr1[0]) - 2;while (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);Sleep(1000); //为了更好的观察打印流程,使用windows下面的Sleep函数睡眠1000毫秒,需引入头文件windows.h。1000毫秒=1秒left++;right--;}return 0;
}

 练习3:简单编写代码实现,模拟用户登录情景,并且只能登录三次

(只允许输入三次密码,如果密码正确,则提示登录成功;如果三次均输入错误,则退出程序)

//简单编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确,则提示登录成功;如果三次均输入错误,则退出程序)#include <stdio.h>
#include <string.h>
int main()
{int i = 0;char password[20] = { 0 };for (i = 0; i < 3; i++){printf("请输入密码:>");scanf("%s", password);//比较2个字符串是否相等,不能使用==,而应该使用库函数strcmp。如果函数返回值为0,表示2个字符串相等if (strcmp(password, "abcdef") == 0)  //需要引入string.h头文件{printf("登陆成功\n");break;}else{printf("密码错误\n");}}if (3 == i){printf("三次密码均输入错误,退出程序\n");}return 0;
}

基本形式strcmp(str1,str2),string compare(字符串比较)。若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

练习4:猜数字游戏实现

//1、电脑产生一个随机数(1-100)
//2、猜数字
//反馈猜大了、猜小了、猜对了
//建议:边写边测试,看是否能实现#include <stdio.h>
#include <stdlib.h>
#include <time.h>void menu()
{printf("**************\n");printf("****1.play****\n");printf("****0.exit****\n");printf("**************\n");  
}
void game()
{//1.生成随机数1-100//rand()%100 + 1;%100范围0-99--->+1范围1-100int ret = rand()%100 + 1; //rand()生成随机数的函数,取值范围0-RAND_MAX(32767)//printf("%d\n", ret); //用于测试//2.猜数字int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess < ret){printf("猜小了\n");}else if (guess > ret){printf("猜大了\n");}else{printf("恭喜你,猜对了\n");break;}}
}
int main()
{int input = 0;//空指针int *p = NULL;srand((unsigned int) time(NULL)); //时间戳。NULL定义空指针。()强制类型转换do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game(); //猜数字的整个逻辑break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);return 0;
}

其中函数不明白的可以根据前篇的学习方法进行查阅资料进行学习。

C语言初阶--函数 中的 2.1 库函数

这里简单圈一下:

rand()

 

srand()

时间戳

 

总结

此篇主要针对折半查找算法进行例题解析,由于内容较少,添加了多道练习题。

今天就暂且更新至此吧,期待下周再会。如有错误还请不吝赐教。如果觉得对您学习有所帮助,还请留下你的支持,以防下次失踪了嗷。

作者更新不易,免费关注别手软。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

Adobe的AI生成3D数字人框架:从自拍到生动的3D化身

一、引言 随着人工智能技术的发展,我们见证了越来越多创新工具的出现,这些工具使得图像处理和视频编辑变得更加智能与高效。Adobe作为全球领先的创意软件公司,最近推出了一项令人瞩目的新技术——一个能够将普通的二维自拍照转换成栩栩如生的三维(3D)数字人的框架。这项技…

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…

【数据分享】1929-2024年全球站点的逐日平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

Java27:SPRING

一&#xff1a;SPRING介绍 1.spring的概念 广义的Spring&#xff1a;Spring技术栈&#xff08;全家桶&#xff09; 广义的Spring泛指以Spring Framework 为基础的Spring技术栈&#xff0c;Spring不在是一个单纯的应用框架&#xff0c;而是逐渐发展成为一个由不同子模块组成的…

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名&#xff08;所有节点&#xff09;配置静态IP&#xff08;所有节点&#xff09;关闭防火墙和seLinux&#xff0c;清除iptables规则&#xff08;所有节点&#xff09;关闭交换分区&#xff08;所有节点&#xff09;修改/etc/hosts文件&…

单片机内存管理剖析

一、概述 在单片机系统中&#xff0c;内存资源通常是有限的&#xff0c;因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性&#xff0c;避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器&#xff08;如 Flash&#xff09;和数据存储器&a…

1. 握手问题python解法——2024年省赛蓝桥杯真题

原题传送门&#xff1a;1.握手问题 - 蓝桥云课 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人&#xff0c;…

15.7k!DISM++一款快捷的系统优化工具

软件介绍 链接 软件介绍 dism是一款由初雨团队开发的win系统优化工具&#xff0c;可当作是微软系统命令行工具dism的GUI版本。可用作系统垃圾清除、启动项管理、程序卸载、驱动管理、系统优化等 该工具个人感觉最重要的就是系统优化选项&#xff0c;它将一些实用、无用或者没…

idea修改模块名导致程序编译出错

本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑&#xff1a; 通过idea菜单创建模块&#xff0c;并用idea菜单修改模块名&#xff0c;结构程序编译报错&#xff0c;出错的代码莫名奇妙。双击maven弹窗clean时&#xff0c;还是报错。因为模块是新建的&am…

微服务学习-Nacos 注册中心实战

1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心&#xff1f; 服务与服务之间调用需要有服务发现功能&#xff1b;例如订单服务调用库存服务&#xff0c;库存服务如果有多个&#xff0c;订单服务到底调用那个库存服务呢&#xff08;负载均衡器&#xff09;&#xff0…

vim如何设置自动缩进

:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 &#xff08;vim如何使设置自动缩进永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

ELK环境搭建

文章目录 1.ElasticSearch安装1.安装的版本选择1.SpringBoot版本&#xff1a;2.4.2 找到依赖的spring-data-elasticsearch的版本2.spring-data-elasticsearch版本&#xff1a;4.1.3 找到依赖的elasticsearch版本3.elasticsearch版本&#xff1a;7.9.3 2.安装1.官方文档2.下载压…

Ubuntu20.04 运行 PL-VIO

文章目录 运行后不知为何没有线特征 运行后不知为何没有线特征

C#与AI的共同发展

C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变&#xff0c;以适应新的挑战和需要。自2000年微软推出C#以来&#xff0c;这门语言经历了多次迭代&#xff0c;不仅成为了.NET平台的主要编程语言之一&#xff0c;还逐渐成为构建各种类型应用程序的强大工具。随着时…

什么情况该换手机?先看后买不踩坑

现在的智能手机发展的非常快&#xff0c;很多刚出来的1000多元的手机性能已经可以流畅玩游戏、刷视频了&#xff0c;而且基本上也能使用3-5年的时。如果真要把手机用到实在不能用了&#xff0c;可能真的会影响生活体验&#xff0c;还有可能因为电池鼓包等问题发生危险&#xff…

centos操作系统上以service形式运行blackbox_exporter监控网页端口

文章目录 前言一、blackbox_exporter是什么二、使用步骤1.获取二进制文件2.准备部署脚本3.执行命令&#xff0c;进行部署4.prometheus中增加需要监控页面的job信息 三、查看部署结果四、配置到grafana中总结 前言 记录一下centos操作系统上以简单的service形式运行blackbox_ex…

使用github提交Pull Request的完整流程

文章目录 1.Fork仓库2. git clone 仓库在本地3.对项目进行修改开发4.上传项目到远程仓库操作补充1. git add .2. git commit -m "提交信息"3. git pull4. git push总结完整工作流程示例 5.将更新的项目pull Request给原来的仓库主人 当多人进行项目的开发的时候&…