取模运算符在数组下标的应用
-
什么是取模运算符%?
定义:
a mod b,设a、b属于正整数且b>0,如果q、r属于正整数满足a=q*b+r,且0≤r<b,则定义:
a mod b = r
注意:取模运算符两侧的除数和被除数都是整数,不能是小数。如果你将小数带入运算,编译器可能会出现以下报错,例如 1% 0.5 :
想要很好地利用%,我们就先要了解一下取模运算符的运算性质:
-
模运算的应用
1. 将下标控制在一定的范围
根据取模运算的运算性质,模运算结果的范围是 0 ~ (除数-1)。反过来就是,如果你想将数据控制在 0 ~ x ,你就可以 %(x+1)。
2. 利用当前下标获取前一个元素
我们想要获取当前下标的前一个时,可能会出现这两种种情况:当前下标是第一个下标时,那么它对应的前一个数据就是下标为末尾的元素;其他情况下,可以直接用当前下标-1来获得前一个元素。例如,当前下标为0时,它对应的前一个元素就是下标为7的元素;当前下标为2时,它对应的前一个元素就是下标为2-1=1的元素
那么我们如何利用%来实现这一个过程呢?
这里我先给出答案在做出解释:
i = (x+size)%(size+1),这里 i 代表最终下标,x代表当前下标,size代表数组的最后一个下标(注意不是数组长度);
-
分析:
根据我们的需求,我们想要x经过%运算后能够变为x-1,并且在特殊情况下,x=0可以变成x等于最后一个下标,再根据取模运算的性质,(x+size)%(size+1)可以写成((x-1)+size+1)%(size+1)--> (x-1)%(size+1)+(size+1)%(size+1),因为 (x-1)一定小于(size+1),所以前半部分的运算结果就是(x-1),后半部分运算结果为0,最终结果就是(x-1)。
其实,主要思想就是将 x 配凑成 x-1,那么可能会有疑惑:为什么不把x直接减一进行运算呢?
事实上,这里有一点需要注意:取模运算 mod 是可以满足的,我们使用%运算主要想应对的就是下标为零的情况,当下标为零时,直接减一,会变成 -1 mod(size+1),这里就涉及负数作为被除数的运算:
在数学中,余数通常定义为非负整数,所以最终答案是1(运算-13 = (-2)*7 + 1),我们会发现这样不就满足我们的需求了吗,例如:(0-1)%(4+1)= 4 ( -1 = (-1)*(4+1) + 4)。
但是,在编程中,通常取模运算(%)的结果会保持符号与被除数一致。这是因为在计算机中,% 运算符会根据被除数的符号来确定余数的符号。所以如果你在编译器上运算这个式子,答案会是-6,因为编译器在运算时会先将负号去掉进行计算:13%7=6,最终的结果会根据被除数的符号确定,因为被除数(-13)是负数,所以最终的答案是-6.
所以,我们不能通过直接减一达到我们想要的效果,而是通过加上一个size来配凑。
3. 利用当前下标获取下一个元素
我们想要获取当前下标的下一个时,可能会出现这两种种情况:当前下标是最后一个下标时,那么它对应的下一个数据就是下标为0的元素;其他情况下,可以直接用当前下标+1来获得下一个元素。例如,当前下标为7时,它对应的下一个元素就是下标为0的元素;当前下标为2时,它对应的下一个元素就是下标为2+1=3的元素
这里我先给出答案在做出解释:
i = (x+1)%(size+1),这里 i 代表最终下标,x代表当前下标,size代表数组的最后一个下标;
如果你看懂了,上面我第一个的分析,那么你也能够理解这个式子是怎么来的。
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……
相关文章:

取模运算符在数组下标的应用
什么是取模运算符%? 定义: a mod b,设a、b属于正整数且b>0,如果q、r属于正整数满足aq*br,且0≤r<b,则定义: a mod b r 注意:取模运算符两侧的除数和被除数都是整数ÿ…...

Firefox(火狐),使用技巧汇总,问题处理
本文目的 说明火狐如何安装在C盘之外的盘,即定制安装路径。如何将同步功能切换到本地服务上。默认是国际服务器。安装在C盘之后如何解决,之前安装的扩展无法自动同步的问题。顺带讲解一下,火狐的一些比较好用的扩展。 安装路径定制 火狐目前…...

耐腐蚀高速数控针阀和多功能PID控制器在流量比率控制中的应用
摘要:在目前的流体比值混合控制系统中,普遍采用的是多通道闭环PID控制系统对各路流量进行准确控制后再进行混合,这种控制方式普遍存在的问题是对流量调节阀的响应速度、耐腐蚀性和线性度有很高要求。为此本文提出的第一个解决方案是采用NCNV系…...

C语言:选择+编程(每日一练Day6)
目录 编辑选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:至少是其他数字两倍的最大数 思路一: 思路二: 题二:两个数组的交集…...

微信小程序教学系列(8)
微信小程序教学系列 第八章:小程序国际化开发 欢迎来到第八章!这一次我们要谈论的是小程序国际化开发。你可能会问,什么是国际化?简单来说,国际化就是让小程序能够适应不同的语言和地区,让用户们感受到更…...

情人节定制:HTML5 Canvas全屏七夕爱心表白特效
❤️ 前言 “这个世界乱糟糟的而你干干净净可以悬在我心上做太阳和月亮。”,七夕节表白日,你要错过吗?如果你言辞不善,羞于开口的话,可以使用 html5 canvas 制作浪漫的七夕爱心表白动画特效,全屏的爱心和…...

操作系统-笔记-第五章-输入输出管理
目录 五、第五章——输入输出管理 1、IO设备的概念和分类 (1)IO设备分类——使用特性 (2)IO设备分类——传输速率 (3)IO设备分类——信息交换(块、字符) 2、IO控制器 &#x…...

感觉自己效率不高吗?学习实现目标的六个关键步骤,让你做任何事都事半功倍!
概述 是否感觉自己效率不高?做任何事情都提不起来精神?开发的时候要完成的功能很多,却不知该如何下手去做?那么你通过这篇文章可以学习到六个完成工作和学习目标的关键步骤,只要简单重复这六个步骤,就可以很轻松的达到你想做到的任何目标。是不是感觉很神奇,我也是亲测…...

【高级IO】- 五种 IO 模型 | 多路转接 - select
目录 IO的基本概念 什么是高效的IO? 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 同步通信VS异步通信(synchronous communication / asynchronous communication) 同步通信VS同步与互斥 阻塞VS非阻塞 其他高级IO …...

在Linux搭建GitLab私有仓库配置实现远程访问私有仓库Gitlab ——【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留…...

ChatGPT应用于高职教育的四大潜在风险
目前,ChatGPT还是一种仍未成熟的技术,当其介入高职教育生态后,高职院校师生在享受ChatGPT带来的便利的同时,也应该明白ChatGPT引发的风险也会随之进入高职教育领域,如存在知识信息、伦理意识与学生主体方面的风险与挑战…...

uni-app在组件中内嵌webView,实现自定义webView的大小,并处理页面中有webview时其他元素点击事件失效的问题
uni-app在组件中内嵌webView,实现自定义webView的大小,并处理页面中有webview时其他元素点击事件失效的问题 uni-app在组件中内嵌webView,实现自定义webView的大小 setWebviewTop() {// #ifdef APP-PLUSvar currentWebview this.$scope.$g…...

档案开发:增加查询和打卡按钮
档案开发:增加查询和打卡按钮 和单据开发的不同点 没有单据类型不是右击–>特性–>单据主表/单据子表,而是右击–>特性–>选择想要的接口访问器类型是NCVO不需要映射不是项目右键–>新建–>其他–>主子表单据结点,而是…...

redis基础细心讲解,一篇了解常用的缓存技术!
今日内容 redis 1. 概念 2. 下载安装 3. 命令操作1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis 6. 在ssm项目中使用缓冲进行CRUD操作Redis 1. 概念 redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL = Not Only SQL),意即“不仅仅…...

Three.js之几何体、高光材质、渲染器设置、gui
参考资料 阵列立方体和相机适配体验Threejs常见几何体简介…gui.js库(可视化改变三维场景) 知识点 注:基于Three.jsv0.155.0 长方体:oxGeometry球体:SphereGeometry圆柱:CylinderGeometry矩形平面:PlaneGeometry圆…...

UE4如何连接dmx---摇头矩阵灯具的创建
UE4如何连接dmx---摇头矩阵灯具的创建 开始创建库! 然后我们开始创建多少个灯珠(注意了:这是矩阵灯,是看灯珠的) 那么这里我们创建6X6灯珠 下面设置灯珠的属性,灯珠有什么属性呢,只有颜色属性&…...

网络聊天室
一、项目要求 利用UDP协议,实现一套聊天室软件。服务器端记录客户端的地址,客户端发送消息后,服务器群发给各个客户端软件。 问题思考 客户端会不会知道其它客户端地址? UDP客户端不会直接互连,所以不会获知其它客…...

ChatGPT只是玩具:生成式人工智能在不同行业的应用
源自:IT经理网 生成式人工智能的十一个行业用例 打开生成式 AI的正确姿势 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿涉及版权等问题&…...

RestFul的风格是什么
RestFul的风格是什么? 当我们谈论RESTful风格时,它指的是一种设计和构建网络应用程序的原则和约定。以下是RESTful风格的一些主要特点: 资源:将应用程序的功能封装为资源,每个资源都有一个唯一的标识符(U…...

【自制C/C++小项目JuLongEditor】使用Windows控制台API来制作一个简单的文本编辑器
2023年8月22日,周二下午 昨天花了一个下午和晚上来制作的, 实现了一些基本的功能, 但由于代码只有130行,所以存在很多不足之处 GitHub:GitHub - JuLongZhiLu/JuLongEditor: C/C小项目,使用Windows控制台…...

中国芯,寻找新赛道迫在眉睫
北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述,一个是中国芯群体中上市公司股价闪崩的有点多,另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业(fabless商业模式)…...

C++ 好用的格式化库--fmt
背景 fmt 库是一个开源的 C 格式化库,它提供了一种简洁、安全和高效的方式来进行字符串格式化。该库的设计目标是提供与 Python 的字符串格式化语法类似的功能,同时保持 C 的类型安全性和性能。 下载与安装 官网下载 fmt 官网地址:https:…...

微信小程序教学系列(3)
微信小程序教学系列 第三章:小程序高级开发技巧 1. 小程序API的使用 小程序API简介 小程序API是小程序提供的一系列接口,用于实现各种功能和操作。通过调用小程序API,可以实现页面跳转、数据存储、网络请求等功能。 使用小程序API的步骤…...

ORB-SLAM系列算法演进
ORB-SLAM算法是特征点法的代表,当前最新发展的ORB-SLAM3已经将相机模型抽象化,适用范围非常广,虽然ORB-SLAM在算法上的创新并不是很丰富,但是它在工程上的创新确实让人耳目一新,也能更好的为AR、机器人的算法实现落地。…...

solidity0.8.0的应用案例11:透明代理合约
选择器冲突 智能合约中,函数选择器(selector)是函数签名的哈希的前4个字节。例如mint(address account)的选择器为bytes4(keccak256("mint(address)")),也就是0x6a627842. 由于函数选择器仅有4个字节,范围很小,因此两个不同的函数可能会有相同的选择器,例如…...

最新消息:谷歌将在Chromebook上运用UWB技术,无线通信更上一层
超宽带(UWB)技术是一种创新的短距离无线通信技术,具有高速数据传输和精确定位物体位置的优势。尽管该技术已经存在一段时间,但最近开始广泛应用于各种设备中。据最新报道,Pixel Watch 2可能会搭载UWB模块,这…...

php+echarts实现数据可视化实例3
效果 全部代码 <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" …...

ubuntu下安装Sphinx,编译pdf
安装WSL2: 以管理员身份打开PowerShellwsl --install 来安装其他 Linux 发行版wsl --list --verbose 查看安装在 Windows 计算机上的 Linux 发行版列表 安装sphinx: sudo apt-get updatesudo apt-get install python3-sphinxsudo apt-get install lat…...

vue2.x项目从0到1(七)之用户权限
此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1(二)之后台管理侧边栏(动态渲染路由以及高亮)_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …...

上传镜像到阿里云的ACR
1、开通阿里云ACR 2、在ACR 中创建命名空间 3、本地安装docker 4、登录到 开通ACR,需要配置访问凭证 [rootmaster ~]# docker login --username***lb registry.cn-beijing.aliyuncs.com Password: 5、给镜像打标签 [rootmaster ~]# docker images REPOSITORY …...