python 除数总是提示为0_python负数求余不正确?——取模 VS 取余

前天小王同学正在leetcode兴致勃勃的刷题,用java写了一版后又习惯性的用python写了一版,代码逻辑完全一样,但提交答案后居然提示【解答错误】!

经过反复调试,发现问题出在涉及求余的地方,python和java得出的结果居然不一样?!

举个栗子

java的整除与求余

7/4 = 1
-7/4 = -1
7/-4 = -1
-7/-4 = 1
7%4 = 3
-7%4 = -3
7%-4 = 3
-7%-4 = -3

python3下的整除与求余

7//4 = 1
-7//4 = -2
7//-4 = -2
-7//-4 = 1
7%4 = 3
-7%4 = 1
7%-4 = -1
-7%-4 = -3

惊不惊喜,意不意外?

推理

我们用简单的数学语言来描述下:

对于整型数a,b来说,取模运算或者求余运算的方法都是:
求整数商: c = a/b;
计算模或者余数: r = a - c*b
但是求模运算和求余运算在第一步不同,取余运算在取c的值时,向0 方向舍入,而取模运算在计算c的值时,向负无穷方向舍入。

那么借助该知识点我们来再次推演下文章开头的例子

计算-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c,c应该是-1.75,如进行求模运算c = -2(向负无穷方向舍入),求余运算则c = -1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。

结论

根据例子及推理。得出如下总结:

  1. 当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

2. 当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。

经过测试,在C/C++, C#, JAVA, PHP这几门主流语言中,%运算符都是做取余运算,而在python中的%是做取模运算。

扩展:维基百科的相关解释

维基百科-模除​zh.wikipedia.org编程语言中,取余和取模的区别到底是什么?​www.zhihu.com

a0040fcd5544e306500a0c9843750529.png

a15ad41edd67a3e57ad34a4ccdac9e87.png

leetcode实例

整数反转 - 力扣(LeetCode)​leetcode-cn.com
a2029568b17ac0b8a083b57fc463e722.png

下面附上两个语言版本的代码实例,大家可以亲身体会下,当除数与被除数符号不一致时一定多多加小心:

Java版

class Solution {public int reverse(int x) {int rev = 0;while (x != 0) {int pop = x % 10;x /= 10;if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;rev = rev * 10 + pop;}return rev;}
}

Python版

class Solution:def reverse(self, x: int) -> int:INT_MAX = pow(2,31) - 1INT_MIN = - pow(2,31)rev = 0while x!=0:if x > 0:pop = x%10x = x//10else:pop = x%-10x = -(x//-10)if rev > INT_MAX/10 or (rev== INT_MAX//10 and pop > 7):return 0if rev < INT_MIN/10 or (rev == INT_MIN//10 and pop < -8):return 0rev = rev*10 + pop            return rev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qldump 备份所有表_MySQL中的备份和恢复是怎样执行的?

- 点击上方“中国统计网”订阅我吧&#xff01;-MySQL备份MySQL中的逻辑备份是将数据库中的数据备份为一个文本文件&#xff0c;备份的文件可以被查看和编辑。在MySQL中&#xff0c;使用mysaldump工具来完成备份。有以下3种来调用mysqldump&#xff1a;1. 备份指定的数据库&…

linux系统管理与服务器配置高志君_如何在 Linux 上安装、配置 NTP 服务器和客户端?...

你也许听说过这个词很多次或者你可能已经在使用它了。在这篇文章中我将会清晰的告诉你 NTP 服务器和客户端的安装。-- Magesh Maruthamuthu你也许听说过这个词很多次或者你可能已经在使用它了。在这篇文章中我将会清晰的告诉你 NTP 服务器和客户端的安装。之后我们将会了解 Chr…

8位可控加减法器_行测高分技巧-资料分析之有效数字加减法取舍

资料分析是我们行测试卷中得分率较高的一个部分&#xff0c;所以对资料分析这一部分的题目我们必须把握。但是做题过程中&#xff0c;考生碰到一些数字较大&#xff0c;列式复杂的题目&#xff0c;就无从下手&#xff0c;不知如何应对&#xff0c;今天陕西京佳教育就和各位考生…

3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下

一、VXLAN 简介(1)定义RFC7348 定义了 VLAN 扩展方案 VXLAN(Virtual eXtensible Local Area Network)。VXLAN 采用 MAC in UDP(User Datagram Protocol)封装方式&#xff0c;是 NVO3(Network Virtualization overLayer 3)中的一种网络虚拟化技术。(2)目的作为云计算的核心技术之…

设置dns_网络速度缓慢怎么办?轻松一键修改DNS设置让网速提升五倍

不知道大家有没有这种情况的发生&#xff0c;在家上网或者看智能电视&#xff0c;打开一个普通网页&#xff0c;明明自己办的是100M的宽带&#xff0c;结果慢得要死&#xff0c;还动不动弹出各种各样的广告&#xff0c;然后这时你又杀毒&#xff0c;又去清内存&#xff0c;结果…

8s nfs 挂载文件_把你的树莓派家庭实验室变成一个网络文件系统 | Linux 中国

导读&#xff1a;使用 NFS 服务器将共享文件系统添加到你的家庭实验室。                             本文字数&#xff1a;8554&#xff0c;阅读时长大约&#xff1a;12分钟https://linux.cn/article-12413-1.html作者&#xff1a;Chris Collins译者&#xff…

SIFT特征提取分析

最近刚开始了解SIFT算法&#xff0c;这是从网上找到的讲得还是比较详细的。 转载自http://blog.csdn.net/abcjennifer/article/details/7639681 **************************************************************************************************************************…

hadoop put命令的格式_工作中需熟练掌握的Hadoop命令

作者信息 Elesdspline目前从事NLP与知识图谱相关工作。工作中需熟练掌握的Hadoop命令导读工作中经常要用到一些Hadoop命令&#xff0c;这里简单列举一下&#xff0c;熟悉基本的命令操作&#xff0c;工作效率事半功倍。Hadoop的基本命令与Linux的基本命令非常相似&#xff0c;对…

直方图

转载自http://blog.csdn.net/lu597203933/article/details/14104505 灰度直方图 这次我从最基本的直方图讲起&#xff0c;一维直方图&#xff0c;至于二维等高维直方图&#xff0c;仅作为了解&#xff0c;后面有时间另开blog详解。 1&#xff1a;首先我们给出一幅图 其中的数据…

如何设置多级标题_办公技巧|标题样式amp;多级列表结合,再也不用手动修改1.1、1.2 ...!...

每周一句Accept the things you cannot change. Have the courage to change the things you can.接受那些你也无法改变的事&#xff0c;而能够改变的事则要勇于行动。1. 标题样式&多级列表结合编制方案、修改合同时&#xff0c;如果需要增加或者删除某一章节、条款&#x…