资讯专栏INFORMATION COLUMN

深入理解取整、取余与取模问题

tracymac7 / 3381人阅读

摘要:区分取余与取模取余与与取模的本质区别取余尽可能让商,进行向取整。理解链对任何一个大于的数,对其进行向取整和负无穷取整,取整方向是一致的。故取模等价于取余。

目录

1. 取整问题

1.0向取整(C语言默认的取整方案)

2.地板取整(向负无穷的方向取整)

3.天花板取整(向+无穷的方向取整)

4.四舍五入取整

汇总例子

2.取模问题 

1.余数的定义

2.两种余数

3.为什么会有这种现象?

3.区分取余与取模

1.取余与与取模的本质区别

2.理解链

3.同符号与不同符号

1.同符号:

2.不同符号


1. 取整问题

1.0向取整(C语言默认的取整方案)

#include#includeint main(){	//本质是向0取整   //trunc()函数也有这种作用,不过返回值是浮点数,而且必须引用math.h头文件	int i = -2.9;	int j = 2.9;	printf("%d/n", i); //结果是:-2	printf("%d/n", j); //结果是:2	system("pause");	return 0;}

2.地板取整(向负无穷的方向取整)

#include #include  //因为使用了floor函数,需要添加该头文件#include 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	system("pause");	return 0;}

 注意:使用floor()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。

 

 注意:python默认的取整方案就是地板取整,后面也正是因为这个原因,才出现了取模的不同!

3.天花板取整(向+无穷的方向取整)

#include #include #include 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	system("pause");	return 0;}

注意:使用ceil()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。

 

4.四舍五入取整

#include #include #include 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));system("pause");return 0;}

注意:使用round()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。

汇总例子

#include #include #include 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));	system("pause");	return 0;}

2.取模问题 

1.余数的定义

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

注意:余数并不一定都是正数,大家一定要牢记这个概念!

2.两种余数

由定义可知:

                     -10%3=-1------>-10/3=-3------->3*(-3)+(-1)=(-10)(C语言中是这样的)

                      -10%3=2------->-10/3=-4------->4*(-3)+ 2=(-10)(python环境中是这样的)

解释C: -10 = (-3) * 3 + (-1)(负余数)

解释Python:-10 = (?)* 3 + 2,其中,可以推到出来,"?"必须是-4,即-10 = (-4)* 3 + 2,才能满足定义。(正余数)

所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的。我们可以称之为分别叫做正余数和负余数。


3.为什么会有这种现象?

由上面的例子可以看出,具体余数r的大小,本质是取决于商q的。

而商,又取决谁呢?取决于除法计算的时候,取整规则

C语言中默认是0向取整,python中默认是-无穷的方向取整。

3.区分取余与取模

1.取余与与取模的本质区别

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

取模:尽可能让商,向负无穷方向取整。

所以:

C中%,本质其实是取余。

Python中%,本质其实是取模。

2.理解链

对任何一个大于0的数,对其进行0向取整和负无穷取整,取整方向是一致的。故取模等价于取余。其实这也是为什么我们常常会认为取模以取余是一码事的原因所在。

对任何一个小于0的数,对其进行0向取整和负无穷取整,取整方向是相反的。故取模不等价于取余。

3.同符号与不同符号

1.同符号:

同符号数据相除,得到的商,一定是正数,即大于0! 故,在对其商进行取整的时候,取模等价于取余。(倘若从数学上理解,就是简单的在负数的前面加一个绝对值即可)

2.不同符号

#include#include 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	system("pause");	return 0;}

从上面可以看出:

被除数为负数时,取余后为负号。

除数为负数时,取余后为正数。

不同符号在C语言中虽然也有一定的规律,但我并不希望大家利用这个规律,而是利用定义老老实实的计算,毕竟这这是针对C语言的结论,在python中就不适用了,因为二者的取整方式是不同的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123618.html

相关文章

  • 通过PHP实现一致性哈希算法

    摘要:通过虚拟节点优化一致性算法为了提高一致性算法的平衡性,我们首先能够想到的是,增加节点数,但是机器毕竟是需要经费啊,不是说增就能随意增,那就增加虚拟节点,这样就没毛病了。 一、案例分析(1)问题概述 假设我们的图片数据均匀的分配在三台服务(分别标注为服务器A,服务器B、服务器C)上面,现在我们要从里面取图片,服务端在拿到这个请求后,怎么会指定,这张图片是存在服务器A、服务器B,还是服务器...

    tulayang 评论0 收藏0
  • 深度剖析凭什么python中整型不会溢出

    摘要:前言本次分析基于解释器,版本在时代,整型有类型和长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在后,统一使用了长整型。 前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在python3后,统一使用了长整型。这也是吸引科研人员的一部分了,适合大数据...

    MSchumi 评论0 收藏0
  • LeetCode 之 JavaScript 解答第二题 —— 两数相加(Add Two Number

    摘要:多位数加多位数,反转链表转化整数,如果整数相加,可能会溢出,此方法行不通。直接进行位数运算,两链表每取出一个就做运算,将结果放入到新链表中。求和运算会出现额外的进位一般进位与最高位进位两种情况。两位数取模运算。 Time:2019/4/2Title: ADD Two NumbersDifficulty: mediumAuthor:小鹿公众号:一个不甘平凡的码农。 题目二:ADD Two...

    Sunxb 评论0 收藏0
  • Python 魔法方法

    摘要:魔法方法基础如果你想所以你写调用初始化一个实例作为一个字符串的官方表示作为一个字符串作为字节数组作为格式化字符串方法在创建实例后调用如果你想控制创建过程请使用方法按照惯例应该返回一个有效的表达式的字符串方法也被称为你的迭代相关如果你想所以你 Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x...

    187J3X1 评论0 收藏0
  • [LintCode] Hash Function

    摘要:又用到了取余公式,推导出。用循环对数组各位进行转换和相乘和累加。因为第二个取余公式证明乘积取余与乘数相加后再取余等价于乘积取余,所以在每个循环内都进行一次取余,以免乘积太大溢出。 Problem In data structure Hash, hash function is used to convert a string(or any other type) into an int...

    Dogee 评论0 收藏0

发表评论

0条评论

tracymac7

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<