【C语言初阶(5)】循环练习题

news2024/11/24 13:46:51

文章目录

  • 1. 计算 n 的阶乘
  • 2. 计算 1!+2!+3!+……+10!
  • 3. 使用二分查找法查找某数
    • 二分查找算法介绍
    • 代码实现
  • 4. 演示字符移动
  • 5. 模拟用户登录场景

1. 计算 n 的阶乘

阶乘

  • 某个数从 1 开始一直乘到这个数本身为止;
  • 例如:3 的阶乘就是 1 * 2 * 3 = 6;
  • n 的阶乘就是 1 * 2 * 3 … * n。

解题思路

  • 如果想要阶乘到 n 的话,就要产生 1-n 的数字,此时就需要用到循环。
  • 通过循环产生 1-n 的数字,然后把这些数字累积乘到一个数上。

代码实现

#include <stdio.h>
int main()
{
	int n, i;
	int ret = 1;//产生的1-n的数字要累乘到ret上存起来,所以ret必须初始化为1
	scanf("%d", &n);

	for (i = 1; i <= n; i++)//产生 1-n 的数字
	{
		ret *= i;//将不断产生的 1-n 的数字累乘到 ret 上
	}
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述

2. 计算 1!+2!+3!+……+10!

解题思路

  • 和上一题一样分别计算从 1-10 的每个数的阶乘,并把这些数全部累加到一个变量上去。

代码实现

#include <stdio.h>

int main()
{
	int sum = 0,ret = 1;
	int i, n;
	scanf("%d", &n);

	for (i = 1; i <= n; i++)
	{
		ret  *=  i;//产生从 1-n 的阶乘并且存到 ret 中
		sum += ret;//将每次产生的阶乘的结果累加到 sum 中去
	}
	printf("%d\n", sum);

	return 0;
}

在这里插入图片描述

3. 使用二分查找法查找某数

题目内容

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

二分查找算法介绍

二分查找

  • 每次将待查记录所在区间缩小一半;
  • 只对已经排序的数据有效。

查找过程

  • 当前数组内的数据元素是按照升序排序的。

在这里插入图片描述

  1. 设置一个查找区间初始值,low 指向第一个元素,high 指向最后一个元素。
  2. 当 low <= high 时,循环执行以下操作:
    • 设一个 mid 为 low 和 high 的中间值:mid = (low + high) / 2,当前这个数组的 mid 是下标 6 的元素 56。
    • 直接将要找的这个关键字的值 21 和 和中间位置的这个值比较一下,发现 21 < 56,说明要找的值一定在 mid 的左半边区域。要将查找范围更新到 mid 左边。
    • 则将新的 high 更新为:key < mid 则:high = mid - 1,因为中间位置56比较过了,不是这家伙。

在这里插入图片描述

在这里插入图片描述

  1. 继续拿 mid 的值和 21 比较,发现 19 < 21,说明待查找的值在 mid 的右边,将 low 更新,key > mid 则: low = mid +1
  2. 然后再取找中间位置,low是 4 high 是 5,mid 的值就是4。

在这里插入图片描述

  1. 拿 key 的值 21 和 mid 的值比较,发现 mid == key 则:return mid

如果要找的值不在数组中

在这里插入图片描述
在这里插入图片描述

  • 查找到最后 low 会大于 high 上下限交换了,此时说明数组中没有俺们要找的数。
  • 折半查找结束条件:high < low
    • 因为这样就说明 high 和 low 之间已经没有元素可以被查找了。

二分查找特点

  • 在数据越多的时候效率越高,假设要 40 亿的数据中查找,第一次就能去掉20亿的数据。
  • 待查找的数据必须是有序的。

代码实现

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组中有多少个元素
	int low = 0,high = sz - 1;//high指向的是最后一个元素的下标,所以要 sz -1
	int n;

	printf("请输入要查找的数:");
	scanf("%d", &n);
	while (low <= high)//这个循环条件说明两者之间还有元素未被查找
	{
		int mid = (low + high) / 2;//这一步必须要写进循环里,不然 mid 无法更新
		if (arr[mid] > n)//如果中间值大于要查找的值,则去 mid 的左半区域去找
		{
			high = mid-1;
		}
		else if (arr[mid] < n)//如果中间值小于要查找的值,则去 mid 的右半区域寻找
		{
			low = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			break;//已经找到了,再继续找就没意义了
		}
	}
	if (low > high)//中间已经没有元素可以被查找了
	{
		printf("找不到了\n");
	}
	return 0;
}

在这里插入图片描述

4. 演示字符移动

题目内容

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

题目分析

  • 假设最终要打印出 hello word!,要演示出的效果就是下面这样;
***********
h*********!
he*******d!
hel*****rd!
hell***ord!
hello*word!
hello word!

解题思路

  1. 创建两个数组,arr1 用来存 hello word!,arr2 用来存放 ***********。
  2. 找出两个字符串数组最右端及最左端字符的数组下标。
  3. 控制左右两端的下标,将 arr1 左右两端的字符从外向里,依次赋值到 arr2 对应的位置上去。

在这里插入图片描述

代码实现

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "hello word!";
	char arr2[] = "***********";
	int left = 0;
	int right = strlen(arr1) - 1;//要拿到的是字符串数组的最后一个元素的下标

	printf("%s\n", arr2);
	
	while(left<=right)//让 arr1 数组中的左右两端的元素向中间移动,然后依次赋给arr2
	{	
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++; right--;
		printf("%s\n", arr2);	
	}
	return 0;
}

5. 模拟用户登录场景

题目内容

  • 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
    提示登录成功,如果三次均输入错误,则退出程序。

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
	int i;
	char arr1[] = "5201314";
	char password[20];

	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);//数组名已经是地址了,此处不需要 &password 了

		//使用 strcmp 来比较两个字符串是否相等,引用头文件 string.h
		//如果两个字符串相等,则 strcmp 的返回值为 0(假)
	
		if (!strcmp(password, arr1))//如果相等则返回的是 0 (假),用 ! 把假变成真
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误,请重试\n");
		}
	}
	if (3 == i)
	{
		printf("你已输错3次,已退出程序!\n");
	}
	return 0;
}

在这里插入图片描述

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

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

相关文章

利用SpringBoot整合mybatis

代码地址&#xff1a;https://gitee.com/jkangle/springboot-exercise.git 1.构建SpringBoot项目 注意版本不能太高版本太高会出现问题整体的项目结构如图 2.导入Mybatis依赖 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency>&l…

vim 对js文件和txt的操作不同

vim 对js文件和txt的操作不同 https://www.runoob.com/w3cnote/ascii.html 同样一段话&#xff0c;vim 123.txt 和 vim 123.js &#xff0c;将下面这些内容复制&#xff0c;然后粘贴&#xff0c; 显示的效果不一样 .js文件 会把 0D 0A 变换为 0A 09 import { request } from…

图像去模糊:RSBlur 数据集以及模糊图像合成方法

本内容主要介绍图像去模糊数据集 RSBlur&#xff0c;以及逼真模糊图像合成方法。 论文&#xff1a;Realistic Blur Synthesis for Learning Image Deblurring 代码&#xff08;官方&#xff09;&#xff1a;https://github.com/rimchang/RSBlur 1.1 背景 运动模糊是由曝光…

89C52RC普中单片机-4

20230629 Thusday lcd1602代码 lcd1602.c #include <REGX52.H>//引脚配置&#xff1a; sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_ENP2^7; #define LCD_DataPort P0//函数定义&#xff1a; /*** brief LCD1602延时函数&#xff0c;12MHz调用可延时1ms* param 无*…

UNet Pytorch实现

用于图像分割的不同种类的Unet模型的实现 UNet - U-Net&#xff1a; 用于生物医学图像分割的卷积网络 https://arxiv.org/abs/1505.04597RCNN-UNet - 基于U-Net的递归残差卷积神经网络&#xff08;R2U-Net&#xff09;用于医学图像分割 https://arxiv.org/abs/1802.06955Atten…

ROS学习总结(一)

渐渐开始接触项目了&#xff0c;准备把以前学习的ros做一些总结&#xff0c;以致孰能生巧。 ros分布框架学习 vscode使用ros节点和包 vscode使用 下载&#xff1a;https://code.visualstudio.com/ 安装&#xff1a;sudo dpkg -i code(tap补全) code 能快捷启动。 插件安装&am…

django.db.utils.OperationalError: no such table: onlyoffice_customuser

我写了个类 Curstomuser 重新运行命令&#xff1a; >python manage.py makemigrations就报错了&#xff1a; 我以为是自己设计的类有问题&#xff0c;结果发现是因为我在其它 py 文件中进行了数据库查询。 而 Django 架构让我忽略了代码运行的前后关系。。。 先注释掉其它…

【STM32】keil MDK-Arm 5.38 功能详解

一、基本概念二、软件安装三、软件介绍3.1 Intro3.2 keil菜单栏3.21 file选项3.22 Edit 选项3.23 View选项3.24 Project选项3.25 Flash选项3.26 Debug选项3.27 Peripherals选项3.28 Tools选项3.29 SVCS选项3.2.10 Window选项3.2.11 Help选项 3.3 keil工具栏 四、设置与项目设置…

七牛云下载文件(显示在浏览器上)

最近在做关于如何将七牛云的文件下载下来&#xff0c;且在浏览器页面展示下载文件。 首先&#xff0c;我们需要注册七牛云账号 七牛云官网。 选择个人账户即可&#xff0c;若是需要企业账户&#xff0c;则可以选择企业账户。 注册成功绑定邮箱后&#xff0c;我们可以创建存储…

NIO三大组件和ByteBuffer

目录 一、NIO三大组件 1、Channel 2、Buffer 3、Selector 二、ByteBuffer 1、基本使用 2、内部结构 3、常用方法 allocate方法 读取方法 字符串与ByteBuffer互转 Scattering Reads 4、念包、半包问题 三、文件编程 1、FileChannel 2、两个Channel传输数据 3、…

解决 pyecharts 地图不显示的问题

总结 在 pyecharts 中如果修改了 online host&#xff0c;会导致绘制的地图显示不全&#xff0c;需要将 host 改回默认的 https://assets.pyecharts.org/assets/ 细节 最近需要使用 pyecharts 绘制中国地图&#xff0c;按官网的示例代码https://github.com/pyecharts/pyecha…

LLM - ChatGLM-6B (General Language Model) 的工程配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper&#xff1a;GLM: General Language Model Pretraining with Autoregressive Blank Infilling ChatGLM是通用的预训练语…

Tower 10:Mac平台Git客户端软件

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。 以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

数据库表结构设计---多表

这里写目录标题 多表设计一对多简介物理外键需求分析sql语句添加物理外键idea图形化工具设置外键 一对一多对多二级目录二级目录 多表设计 一对多 简介 一个表的某个字段&#xff0c;对应一个表 父表 子表 物理外键 需求分析 sql语句添加物理外键 设置物理外键的sql语句 为…

【强化学习】常用算法之一 “SAC”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Ameya360:广和通发布新一代5G FWA解决方案

为满足日益增长的5G宽带连接需求&#xff0c;提升FWA部署的经济效益和技术可行性&#xff0c;广和通在MWCS 2023期间发布了基于新一代5G模组FG190&FG180的5G FWA整体解决方案&#xff0c;为FWA等移动终端提供了灵活、便捷、高效、可靠的联网方案&#xff0c;促进FWA快速迭代…

SC2161旋变数字转换器可pin对pin兼容AD2S1210

SC2161 是一款 10 位至 16 位分辨率旋变数字转换器&#xff0c;集成片上可编程正弦波振荡器&#xff0c;为旋变器提供正弦波激励。可pin对pin兼容AD2S1210。 转换器的正弦和余弦输入端允许输入 3.15 Vp−p 27%、频率为 2 kHz 至 20 kHz 范围内的信号。Type II 伺服环路用于跟踪…

基于51单片机的智能照明系统

目录 基于51单片机的智能照明系统一、原理图二、部分代码三、视频演示 基于51单片机的智能照明系统 功能&#xff1a; 1.通过LCD屏幕显示实时时间、光强和物体等 2.通过DS1302获取实时时间 3.通过按键调整灯的开关时间和手自动设置手动模式下手动开灯 4.蜂鸣器报警功能 5.上位…

“因构建 而可见”,亚马逊云科技中国峰会助力企业数字化转型升级

过去十年&#xff0c;数字化转型的浪潮携带着机遇和挑战席卷而来&#xff0c;几乎每个企业都在做数字化转型&#xff0c;开始向大数据、人工智能等新技术寻求生产力的突破。但随着数字化转型深入&#xff0c;很多企业开始感受到数字化投入的成本压力&#xff0c;加之新技术正带…

ML算法——Support Vector Machine随笔【机器学习】

文章目录 4、Support Vector Machine (SVM)4.1、理论部分4.1.1、更优的决策边界4.1.2、解决低维不可分问题 4.2、sklearn 实现4.2.1、SVM 分类&#xff08;SVC&#xff09;4.2.2、SVM回归&#xff08;SVR&#xff09;4.2.3、网格调参 4.3、案例 4、Support Vector Machine (SVM…