IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C深刨_符号_完结篇 【全网第二 负数取模/取余深度刨析!!!】 -> 正文阅读

[C++知识库]C深刨_符号_完结篇 【全网第二 负数取模/取余深度刨析!!!】

深度理解取余/取模运算

一,关于取整你要知道的!!!

1,向0取整

int main(){
	int a = 2.9;
	int b = -2.9;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述
结果为啥是2和-2呢?
本质上是向0取正 解释一下:

在这里插入图片描述所以结果是-2 和 2

2,向-∞取整

#include<math.h>
int main(){
	printf("%.1f\n", floor(-2.9)); //-3
	printf("%.1f\n", floor(-2.1)); //-3
	printf("%.1f\n", floor(2.9)); //2
	printf("%.1f\n", floor(2.1)); //2
	return 0;
}

在这里插入图片描述解释:
在这里插入图片描述

3,向+无穷取整

#include<math.h>
int main(){
	//本质是向+∞取整,注意输出格式要不然看不到结果
	printf("%.1f\n", ceil(-2.9)); //-2
	printf("%.1f\n", ceil(-2.1)); //-2
	printf("%.1f\n", ceil(2.9)); //3
	printf("%.1f\n", ceil(2.1)); //3
	return 0;
}

解释:
在这里插入图片描述

4,四舍五入取整

#include<math.h>
int main(){
	//本质是四舍五入
	printf("%.1f\n", round(2.1));
	printf("%.1f\n", round(2.9));
	printf("%.1f\n", round(-2.1));
	printf("%.1f\n", round(-2.9));
	return 0;
}

这个了解,主要记住1和2

汇总:

#include<math.h>
int main(){
	const char * format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n";
	printf("value\tround\tfloor\tceil\ttrunc\n");
	printf("-----\t-----\t-----\t----\t-----\n");
	printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3));
	printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8));
	printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5));
	printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3));
	printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8));
	printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5));
}

在这里插入图片描述

经上所说,取整就会很多种,对于正数向-无穷和向0都是一样的,但是对于负数是不一样的,先知道了这个做个铺垫!!!

二,取模/取余

取模概念:
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且0 ≤ r < d。其中,q被称为商,r 被称为余数。

比如:10=3 * 3+1 10/3=3 余1
a=q * d+r 也就是a/d=q 余r

对应代码:

int main(){
	int a = 10;
	int d = 3;
	printf("%d\n", a%d); //结果是1
	//因为:(被除数)a=10,(除数)d=3,(商)q=3,(余数)r=1 0<=r<d(3)
	//所以:a = q*d+r -> 10=3*3+1
	return 0;
}

看一下负数呢

int main(){
		int a = -10;
		int d = 3;
		//printf("%d\n", a/d); //C语言中是-3,很好理解
		printf("%d\n", a%d);
	return 0;
}

在这里插入图片描述

但是这就违背了定义呀,看定义:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且0 ≤ r < d。其中,q被称为商,r 被称为余数。r代表余数 但是再上段代码中余数是-1 呀
不在0<=r<d 这个范围呀 他是小于0的

> 故,大家对取模有了一个修订版的定义: 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r| < |d|。其中,q 被称为商,r 被称为余数
这样就可以解释-10%3=-3 余-1了
a=q * d+r ——> -10=(-3) * 3+(-1)

在不同语言中,取模的结果可能是不一样的,对于余数是正的我们叫正余数,反之叫负余数

再来看:
在这里插入图片描述
换了一下,咋余数就变了
这就是取决于商
在这里插入图片描述

取余和取模一样吗?负数如何取模?

是不一样的,取余或者取模,都应该要算出商,然后才能得出余数

取余:尽可能让商,进行向0取整。

在这里插入图片描述

取模:尽可能让商,向-∞方向取整

在这里插入图片描述
两者的相同之处:

再0~+∞ 即正数 这个范围都是向0取整
不管是C还是python
所以对于取模和取余有时候叫法一样

在这里插入图片描述

理解链:
对任何一个大于0的数,对其进行0向取整和-∞取整,取整方向是一致的。故取模等价于取余
对任何一个小于0的数,对其进行0向取整和-∞取整,取整方向是相反的。故取模不等价于取余

两个同符号数取模/取余

结论1,同符号数据相除,得到的商,一定是正数(正数vs正整数),即大于0!!! 故,在对其商进行取整的时候,取模等价于取余

在这里插入图片描述

结论2 参与取余的两个数据,如果同符号,取模等价于取余

在这里插入图片描述

两个不同符号数取模/取余

上面两组例子都是同符号数的我们再聊聊,两个不同符号的数是什么样的

int main(){
		printf("%d\n", -10 / 3); //结果:-3
		printf("%d\n\n", -10 % 3); //结果:-1 为什么? -10=(-3)*3+(-1)
		printf("%d\n", 10 / -3); //结果:-3
		printf("%d\n\n", 10 % -3); //结果:1 为什么?10=(-3)*(-3)+1

	return 0;
}

在这里插入图片描述

真的是这样的吗?我们来看这个python中取模和取余是啥情况?

在这里插入图片描述

不一样哦!!!

我们细细回顾一下:

重新看看定义:
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q * d + r , q 为整数,且0 ≤ |r|< |d|。其中,q 被称为商,r 被称为余数。
a = q * d + r 变换成 r = a - q * d 变换成 r = a + (-q * d)。
对于:x = y + z,这样的表达式,x的符号 与 |y|、|z|中大的数据一致.
而r = a + (-q * d)中,|a| 和 |-q*d|的绝对值谁大,取决于商q的取整方式。
c是向0取整的,也就是q本身的绝对值是减小的.
在这里插入图片描述python是向-∞取整的,也就是q本身的绝对值是增大的。
在这里插入图片描述

结论:如果参与取余的两个数据符号不同,在C语言中(或者其他采用向0取整的语言如:C++,Java),余数符号,与被除数相同

完结 本篇知识点有点多,可以反复观看几次,本篇文章内容搞明白,以后取模/取余的就不用看了

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:18:07  更:2021-10-23 12:18:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:39:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码