
Python模运算:时钟法则解密 0
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等,大概也是一样的吧。
相关阅读
互联网:连接世界的无形网络
互联网已成为日常生活中不可或缺的一部分,人们通过手机、平板、电脑等设备随时连接全球网络,进行社交、购物、学习等活动。互联网由无数相互连接的本地网络组成,通过电话线、光缆、无线传输等方式交换信息。本地网络规模各异,从家庭办公网络到大型商业网络,均提供资源共享和高效通信。数据以二进制形式存储和传输,通过电信号、光信号或无线信号在网络中传递。带宽和吞吐量是衡量网络性能的关键指标,带宽是理论最大传输能力,...
思科英伟达联手加速AI数据中心
思科与英伟达近日宣布合作,旨在加速企业级AI数据中心基础设施的部署。合作内容包括:1)联合开发AI优化以太网解决方案,思科将基于英伟达的Spectrum-X平台设计数据中心交换机,整合Silicon One芯片与SuperNICs,构建高性能、低延迟的网络架构;2)通过统一架构实现跨平台互操作性,整合Cisco Silicon One和NVIDIA Spectrum-X技术,支持企业在同一管理框架...
未来自动汽车愿景
自动汽车与自动驾驶汽车不同,它完全无需人工干预,所有操作均由系统自动完成。目前,自动汽车仍处于概念阶段,尚未在市场上出现。我设想中的自动汽车是一个方形的移动“箱子”,内部没有方向盘或踏板,乘客只需通过语音或触摸控制即可操作。这些车辆由城市控制中心统一调度,实时优化路线和速度,确保交通流畅,避免拥堵。自动汽车将极大减轻出行负担,减少社会成本,并显著降低环境污染。尽管目前已有无人驾驶公交车等局部应用,...
相关新闻
请登录后发表评论/回复/订阅/点赞
评论 (0)