Python %取模小故事

以前,有个地方,这里住着东之人和西之人,东之人只能往东走,西之人只能往西走。好在这个地方有公共马车,可以搭载他们向东和向西走。

例如一个东之人,要向他东边4公里的一个地方,马车每隔3公里可以停一下,于是他坐车到3公里处下车,再向东走了一公里。

divmod(4,3)

(1, 1)

而一个西之人,也是要到东边4公里的地方,但是因为他只能往西走,所以他必须坐车经过目的地,在下一站即6公里处下车,此时他做了2站,然后向此时位于他西边的目的地走2公里。

divmod(4,-3)
(-2, -2)

一个东之人向西4公里处:

divmod(-4,3)
(-2, 2)

一个西之人向西4公里处:

divmod(-4,-3)
(1, -1)

参数中的第一个数是到目的地的距离,正数是要向东,负数是要向西。
参数中的第二个数是马车每站地间的距离,正数是东之人,负数是西之人。
结果中的第一个值,是做过几站地,正数是东之人去东边,或西之人去西边。负数,是东之人去西边,或西之人去东边。
结果中的第二个值,是又走了多少路,正数是东之人走的路,负数是西之人走的路。

模数的真正意义,从何诞生,我并不知晓,可能只是数学家的一个小游戏,但据说现在被应用在许多地方,物理学、计算机编程等。

Python基础教程 第三版 第四页

对于整除运算,需要明白的一个重点是它向下圆整结果。因此在结果为负数的情况下,圆整后将离0更远。这意味着对于-10 // 3,将向下圆整到-4,而不是向上圆整到-3。

补充

负数的除法和取模运算(Python 2.7和C的比较)
Python’s modulo operator and floor division
1、取模,来自欧几里得算法
2、数论,有提到负数的取模
3、python中,为了方便使用了向负取整,所以取模就相应的变为以上规则。
x = (x // y) * y + (x % y)

以前的糟粕

之前片面的成果,仅考虑了取模,没考虑取整,考虑取整后,上面的小故事又好理解,又好记忆!
另类的运算符,于是查,啥是模!

modulo:

(in number theory) with respect to or using a modulus of a specified number. Two numbers are congruent modulo a given number if they give the same remainder when divided by that number.(在数论中)关于或使用指定数的模。如果两个数除以一个给定数得到相同的余数,则这两个数是一个给定数的同余模。

“19 and 64 are congruent modulo 5”

modulus:比,率;基本单位,计量单位;系数,指数

A natural number used as a specified divisor in modular arithmetic. 在模运算中用作指定除数的自然数。

modular:模块

a%b=c

我更愿意理解为,B是一个固定的模块,C是A最大整数模块B后,剩下的量。

我在搜索到的视频中,看到一个用时钟来做比较的,但还是听的模糊,因为我并没有理解模到底是个啥,于是用bing和翻译得到以上的结果。了解模到底是啥后,就能用自然语言去概括了。

a%b=c

当模块是个负数时,其他数与他运算得到的模数都是负数,范围是[b+1,0]。

如果是个正数,就是[0,b-1]

当常规的情况下,a和b都是正整数,用最自然的语言去描述,每次减掉b个数,就进入了下一个循环,即当a-b时,下一个循环就是(a-b)-b,如果一个一个的减,当减掉b个数时,他又回到了原点,要去减下一波b,就像是钟表的12与0重合一般。

最后减的不够减了,要么没有了,b被a整除。那模就是0。要么剩下的不够余下的整除,余下的一个一个的填到这个循环里,最后填到几,模就是几。其实就是这个循环时,剩几是几。

但如果引入了负数。

模块这个词我不知道那个年代出现的,假设他是计算机时代在计算机编程运算时出现,那我们就用计算机的思维去理解。就如常数e出现的故事一样。就很容易理解了。如果模就是为了计算机而出现的。

那程序员定义,a%b=c中,b就是个模块。正数就是0到+∞的方向,负数就是0到-∞的方向。但模块循环后,又回到了最初的0,而准备下一个循环,那么就把模块当作一个圆。无论模块b还是数值a,只要是整数,就是顺时针,只要是负数,就是逆时针。

把数一层一层的缠绕,最后的终点就是模数。正好我们假设的结构等同于那真TM黑的运算结果。那就把这个假设当作真实。

然后我们去用一个能套的上的运算式来概括这个缠绕。

a%b=c 参考上面的图

假设a/b仍是常规规则。

如果a>=0,b>0。

c=(a-b*int(a/b))

如果a>=0,b<0

c=-(|b|-(a-|b|*int(a/|b|)))

如果a<0,b>0

c=b-(|a|-int(|a|/b))

如果a<0,b<0

c=-(|a|-|b|*int(|a|/|b|))

要是不理解其本质,强行记公式的话,头晕喷血。

可能是每个人都有每个人的本性吧,我讨厌理科复杂的公式是有一点点本性的原因的,其他的原因就是人生了。

但要是把个绕绕的图记住,那就不是个事了!

那这个模数到底有啥用,真要让编书、教课的老师好好学学历史!
作者:一心月
https://www.bilibili.com/read/cv6406588
出处: bilibili
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jhsxy2005/article/details/114186952