【C语言】入门必看之循环练习(含二分查找动图)

news2024/11/13 14:37:33

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言
⚡注:此篇文章的 代码风格部分 将根据《高质量 C++/C 编程指南》 —— 林锐 进行说明。该部分将用紫色表示
Alt

该篇将对循环语句进行简单练习。

文章目录:

    • 一个小tip:if的风格
    • 二分查找
    • 计算1!+2!+3!+....+n!
    • 实现多个字符从两边向中间汇聚


一个小tip:if的风格

if 中与零值的比较:
📙布尔变量:

不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较

因为TURE的值没有统一的标准,所以对于布尔变量好的书写风格为:

if(num) 这里表示num为真
if(!num)这里表示num为假
📙整形变量
较好的书写风格:
if(num == 0)
if(num != 0)
📙指针变量
较好的书写风格:
if(num == NULL)
if(num != NULL)
尽管 NULL的值和0相同,但是意义不同。
这样的风格不会让别人误解变量的类型。

另外,有时为了防止将 if(num == 0) 写成if(num = 0) ,可以将变量放在后面,即if(0 == num) ,就算写成了if(0 = num),因为0是常量,不能被赋值,当程序运行起来后,编译器会报错,可以很快发现问题。

大家如果有兴趣,可以在 《高质量 C++/C 编程指南》 —— 林锐 里了解。


二分查找

以下为二分查找的思维动图:
查找有序数组 元素 7 的下标

所以我们可以将核心分为4部:

  1. 确定查找范围的左右下标,left和right
  2. 根据左右下标(left 和 right),求出中间元素的下标;
  3. 根据mid指定的元素,进行比较,如果相同返回mid,不同就调整left和right,确定最新的范围。

代码如下:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 0;//作为查找标志
	while (left <= right)
	{
		int mid = (right + left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;//调整范围
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;//调整范围
		}
		else
		{
			flag = 1;
			printf("下标为:%d\n", mid);
			break;
		}
	}
	if (flag == 0)
	{
		printf("不存在该元素,无法找到该下标\n");
	}
	return 0;
}

计算1!+2!+3!+…+n!

在这道题中,首先要考虑如何计算一个阶乘,对于n!,其实就是将1~ n累计乘在一起就可以了,对于1~ n的数值,直接用循环就可以产生。
计算阶乘:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1; //用来保存累乘的值 
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);
	return 0;
}

既然现在可以计算阶乘了,要计算阶乘的和,只需要用一个循环让n可以变动,再进行求和即可。

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int sum = 0;
	int j = 0;
	for (j = 1; j <= n; j++)
	{
		int ret = 1; //保证上次阶乘的结果不会在循环中累乘起来
		for (i = 1; i <= j; i++)
		{
			ret *= i;
		}
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

但是在过程中出现了大量的重复计算,都需要重新从1开始累乘,导致效率不是很高。所以我们将重复计算规避。因为 (n-1)! * n 就是 n! ,根据此,改写代码。

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	int i = 0;
	int sum = 0;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

实现多个字符从两边向中间汇聚

实现效果如下:


这个问题我们可以通过两个相同大小的数组,用循环将一个数组的内容覆盖到另一个数组上。

#include<stdio.h>
#include<windows.h>
int main()
{
	char arr1[] = "Welcome to the world";
	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--;
		Sleep(1000);//1000毫秒
		system("cls"); 
	}
	 printf("%s\n", arr2);
	return 0;
}

用system函数可以执行系统命令,通过“cls” 来清空屏幕产生一个好的效果。


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

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

相关文章

AI落地:10分钟变身Excel高手

本文首发公众号突围一只鹰。 使用Excel的时候经常有几个难点&#xff1a; 有些功能不知道如何操作不知道该用哪个公式不知道公式的参数如何设置复杂数据处理不知道如何写公式多表链接的时候不知道如何写公式其他数据源导入Excel只会手动录入 有了ChatGPT之后&#xff0c;很多…

求爷爷告奶奶,阿里大佬才甩出这份Spark+Hadoop+中台实战pdf

Spark大数据分析实战 1、Spark简介 初识Spark Sp ark生态系统BDAS Sp ark架构与运行逻辑 弹性分布式数据集 2、Spark开发与环境配置 Spark应用开发环境2置 使用Intelli i开发Spark 远程调试Spark程序 Spark编译 配置Spark源码阅读环境 3、BDAS简介 SQL on Spark S…

Windows使用flask部署HTML网页的方法

使用Flask python运行设计的好的html网页&#xff0c;已经配套的css和js文件&#xff1a; 前提条件 html、css 和 js 在同一个目录之下 html 内使用 css 和 js &#xff0c;需要使用相对路径flask python 程序可以和 html 不在同一个目录 即&#xff1a;python程序可以在D盘…

sql server 数据库

1、窗口函数 sqlserver中窗口函数和OVER()函数_lfw2019的博客-CSDN博客参考&#xff1a;https://blog.csdn.net/qq_41805514/article/details/81772182 https://blog.csdn.net/qq_27997957/article/details/82383328一、OVER() 函数  语法结构&#xff1a;OVER([ PARTITION B…

【C++初阶】动态内存管理

一.C内存分布 说明&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的&#xff1b; 2. 内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存&#xff0c;做进程间通信&…

【Leetcode刷题】算法:合并两个有序链表

文章目录 一、题目介绍二、解决办法三、提交结果 一、题目介绍 二、解决办法 首先定义一个名为ListNode的类&#xff1a; class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextListNode代表一个链表节点&#xff0c;每个节点包含一个值&#xff…

【python】给你女神制作一个520图片墙吧~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用 所需软件&#xff1a; Python 3.8 解释器 Pycharm 编辑器 模块使用&#xff1a; 内置模块 import re >>> python独有的匹配字符串的模块&#xff0c;该模块种提供功能基于正则表达式实现的&#xff0c…

六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30

目录 1. 重点词汇 proofread / ˈpruːfriːd / v.校对&#xff0c;校阅 autonomous adj.独立的 obsession n. 喜好 ample …

网络安全的学习路线

在众多高大上的学习路线指导中&#xff0c;尝试做一股清流&#xff0c;把要讲清楚的都讲清楚&#xff0c;该学些什么&#xff0c;学到哪个程度进入到下一阶段的学习这些才是最重要的。 在学习之前首先要做好学习的系统规划&#xff1a; 1.目前市场需求主流的岗位里&#xff0…

vue3+ts+wangEditor5菜单栏添加自定义图标按钮,自定义弹出界面内容,自定义插入链接 五步走

Wangeditor安装&#xff1a;VUE3的安装 &#xff0c;其它看官网&#xff1a; npm install wangeditor/editor --save npm install wangeditor/editor-for-vuenext --save 官网&#xff1a;优势 | wangEditor 官方插入自定义内容样例&#xff1a; https://github.com/wange…

XDP入门体验之hello world

本文目录 1、下面这二张图&#xff0c;能非常好的说明XDP在Linux内核里的网络数据处理架构上的位置。2、XDP提供了可编程的灵活处理方式&#xff0c;XDP 程序可以通过 XDP action code来指定驱动程序对报文的后续处理方式&#xff1a;3、一个将收到的报文在XDP里直接丢弃的例子…

一款IP合并和分解工具

一&#xff1a;需求说明 近期在工作中有个需求&#xff0c;需要将七千多个ip地址&#xff08;有的带掩码&#xff0c;有的不带掩码&#xff09;进行合并尝试&#xff0c;看能不能通过合并减少ip的条目数。这就涉及到ip和掩码的计算&#xff0c;举例如下: 192.168.1.0/25 192.16…

第四章 matlab的循环结构

循环(loop)是一种 matlab 结构,它允许我们多次执行一系列的语句。循环结构有两种 基本形式:while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在 while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下 去。相对地,在 fo…

前端uniapp+后端springboot 详细教程《实现微信小程序授权登录》(附完整前后端项目demo)

实现微信小程序授权登录 1、前端技术栈1.1、uniapp1.2、前端封装工具1.3、Hbuilderx构建uniapp项目 2、后端技术栈2.1、创建springboot后端项目2.2、数据库准备2.3、创建实体类2.4、后端工具类2.5、mapper和service接口2.5、Service实现类2.6、微信用户的控制层Controller 微信…

怎么将png转jpg在线处理?图片转换格式工具分享

做设计的小伙伴经常需要进行图片格式转换&#xff0c;但是下载安装软件比较耗费时间&#xff0c;操作起来也很不方便&#xff0c;今天就来介绍一个在线格式转换的方法&#xff0c;下面以png转jpg在线&#xff08;https://www.yasuotu.com/geshi&#xff09;处理为例子给大家演示…

基本的排序算法

一、插入排序 基本思想&#xff1a;在待排序的元素中&#xff0c;假设前面n-1(其中n>2)个数已经是排好顺序的&#xff0c;现将第n个数插到前面已经排好的序列中&#xff0c;然后找到合适自己的位置&#xff0c;使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素…

JVM内存模型概述

当谈到Java虚拟机&#xff08;JVM&#xff09;的内存模型时&#xff0c;我们需要了解JVM如何管理内存并执行Java应用程序。理解JVM的内存模型对于编写高效、可靠的Java代码至关重要。本文将介绍JVM的内存模型&#xff0c;并通过图示进行说明。 JVM内存模型概述 JVM内存模型定义…

5年自动化测试经验的一些感悟—愿测试进阶路上的你不在迷茫

作为一个测试人&#xff0c;我们或多或少都听过或用过自动化&#xff0c;我们都曾在初入测试行业时&#xff0c;满怀期待的以为测试的尽头是不用测试员点点了&#xff0c;项目一提测&#xff0c;小手点下自动化的开关&#xff0c;瞬间测试的工作就完成了。 这就是我一开始从开…

Python-增加b站视频播放量

前言 本文是该专栏的第1篇&#xff0c;后面会持续更新对应平台干货知识&#xff0c;记得关注。 需求背景和说明&#xff1a;实现获取真实播放量&#xff0c;以及增加播放量 废话不多说&#xff0c;跟着笔者直接往下看正文&#xff0c;在文中将结合代码进行详细说明。&#xf…

【数据结构】从数据结构角度深入探究队列

队列是计算机科学中的一种基本数据结构&#xff0c;用于存储和管理数据。在计算机程序中&#xff0c;队列被广泛应用于任务调度、进程管理等场景。本文将介绍队列的概念、特点、常见操作以及应用。 文章目录 队列的概念队列的应用队列的存储结构队列接口的实现队列的初始化队尾…