模的计算方法
python模的计算有时令人困惑,包括我自己。这里总结一下它的计算方法,以防将来连自己也忘掉了。
模计算的一般表达式是 a % b = c,这里a, b, c为整数。我没研究过小数的模计算,也没见过(可能根本就没有)。
先看几个简单的例子:1 % 1 = 0,2 % 2 == 0。它可以用于表示a除以b的余数。按这种逻辑,a % b (b = n*a, a, b,n 为正整数或0)永远都是0。比如:2 % 1 = 0,4 % 2 = 0。这是正整数(含0)计算结果为0的情况。
再看不为零的情况:1 % 4 = 1, 2 % 4 = 2, 3 % 4 = 3;4 % 3 = 1,5 % 3 = 2;7 % 3 = 1,8 % 3 = 2。我们发现计算结果呈现重复现象,就像时钟一样:1、2、3、1、2、3…,没错,就是时钟。如果我们把b设为12,就可以模拟出与时钟完全一样的结果:1 % 12 = 1, 2 % 12 = 2,…, 11 % 12 = 11,13 % 12 = 1, 14 % 12 = 2,… 23 % 12 = 11。 你可以在心中默念:上午1点、上午2点,上午11点、…下午1点、下午2点、下午11点。循环反复,周而复始。这不就是一个时钟吗?如果有人告诉现在是23点,你马上会想到是下午(晚上)11点,速度快到你根本不用想,因为这在日常生活中太常见了,你在大脑中已经形成了肌肉记忆。
当b不为12时,情况就变得不那么直观了,特别是当出现负数时,情况变得复杂起来。但是别紧张,按照“时钟”的解题方法,一样能使问题迎刃而解。心里永远装着一个时钟,这是模运算的关键。如果你愿意,你可以每次在做这种运算时在纸上画一个“挂钟”,就像你家里墙上挂的电子石英钟一样。钟的刻度根据你的需要来画。这非常有助于你进行计算。
我们来看几个例子:
3 % 7 = 3, 8 % 7 = 1。计算结果为何如此,显而易见,无须多说,我们只需把它们理解为只有7个小时、8个小时的时钟你就明白了;
3 % -1 = 0,3 % -2 = -1。这里我们把负数当成一个镜像的时钟,或逆着走的时钟,或干脆叫逆时钟。-1 表示反着的只有1个小时的时钟,时针顺方向走了三圈,又回到0点,所以结果是0;-2表示反着的只有2个小时的时钟,时针顺方向走了1圈加1个小时,对于逆时钟来说,就是-1点,所以结果是-1。
再看几个例子:
5 % -8 = -3,5 % -9 = -4。对比 5 % 8 = 5, 5 % 9 = 5,你会不会脑子开始有点迟钝了?记住:时钟,时钟而矣。时针顺时针方向走了5个小时,可不就是只有8个小时的“逆时钟”的-3点吗?同理,时针顺时针方向走了5个小时,可不就是只有9个小时的“逆时钟”的-4点吗?
以此类推:
9 % -8 = -7, 12 % -9 = -6。哇,我希望你的大脑还没有打结。很好理解:对于 9 % -8,同样是一个只有8个小时的“逆时钟”,时针顺时针走了一圈加1个小时,对于只有8个小时的“逆时钟”来说,就是-7点,所以结果就是-7;同理,对于12 % - 9,时针顺时针走了一圈加3个小时,对于只有9个小时的“逆时钟”来说,就是-6点,所以结果就是-6。
再来几个例子:
11 % -8 = -5, 23 % -8 = -1。这里我就不作过多解释了,如果你把时钟放在心里,相信聪明的你一定比我算得还快。
由此可见,随着时针转的圈数变大,结果也越来越不那么直观了。但只要使用“时钟”法,很容易算出结果。
现在,轮到大boss出场。如果时针是逆时钟方向走的会怎么样?看下面的例子:
-8 % 7 = 6,-16 % 7 = 5。看到这个结果,估计你可能有点怀疑它是不是有问题?结果没有问题,模运算就是这么反直觉的。这里,对于一个只有7个小时的正常时钟(“顺时钟”),时针逆时针方向走了一圈加1个小时,不就是只有7个小时的时钟的6点钟吗?同理,对于一个只有7个小时的正常时钟(“顺时钟”),时针逆时针方向走了两圈加2个小时,不就是只有7个小时的时钟的5点钟吗?
这里要提醒注意一下,操作符“%”两边的数的正负号与计算结果的正负号也是“反直观”的。它与一般的四则运算不一样。只有右边那个数的符号才能决定结果的正负号,即“顺时钟”的结果为正,“逆时钟”的结果为负,不管时针是顺时走还是逆时走。
最后,如果时钟及时针都是反的会怎么样?看下面的例子:
-8 % -9 = -8,-11 % -9 = -2,-19 % -9 = -1 。这个反而是最好计算的。你就把它当成如下例子的完全翻转(镜像):
8 % 9 = 8, 11 % 9 = 2, 19 % 9 = 1。当然,你也可以用我上面讲的”时钟计算法“来计算,结果也一样。
总结:
模运算遵循”时钟计算法“,时钟的类型(顺时或逆时)决定结果的正负,全正与全负的计算结果数值 一样,正负相反。
数学领域的模运算是不是一样的呢?我没研究,我判断必须一样,不然发明编程软件的人一定是过份聪明以为自己比数学家还要厉害。那是不可能的。其次,除了python,Ruby(我很喜欢的一门编程语言,可以说最喜欢,可惜快要作古了)的模运算也是一样的。至于其它编程语言,例如c/c++,java等,大概也是一样的吧。
评论
0条评论
请登录参与评论吧