前天小王同学正在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

leetcode实例

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

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

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

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

  1. python 除数总是提示为0_Python错误的处理方法

    异常的捕获与处理 什么是错误 简而言之:还没运行,在语法解析的时候,就发现语法存在问题,这个时候就是错误. 什么是异常 简而言之:代码写好之后,无明显语法错误(这个时候,编辑器不知道有错,语法解析时也 ...

  2. python中除法(/)、取模(%)、取整除(//)、幂(**)运算

    文章目录 除法("/") 运算 取模("%")运算 取整除("//")运算 幂运算 除法("/") 运算 #除法运算 i ...

  3. C语言大数阶乘取余,python中math模块常用函数介绍 取模(取余)取绝对值 求阶乘 求最大公约数最小公倍数 取对数 取根号 取幂(取次方) 取整函数 三角函数与反三角函数...

    前提:import math 两个常用常量 e = 2.718281828459045 pi = 3.141592653589793 >>> import math >> ...

  4. 程序员数学基础【三、取模运算(取余运算功能重叠部分)】(Python版本)

    测试使用语言:[Python] 由于此类语言入门非常容易,哪怕初中生亦可以,并且本科/研究生写论文.做实验多数所用语言都是[Python]故而选择此语言. 代码运行平台:[win10 x64] 代码环 ...

  5. python负数取模_负数的取模运算

    我们知道,在不同的语言中,对负数执行取模运算,结果有可能会是不同的.例如,(-11)%5在python中计算的结果是4,而在C(C99)中计算的结果则是-1. truncate除法 && ...

  6. 【C语言】深度理解 负数取余 取模

    C语言深度理解 负数取余 取模 关于取余和取模的问题 定义 取余时有负数怎么计算? 取余和取模的区别 取余和取模时候等价什么时候不等价 总结 关于取余和取模的问题 许多小伙伴在刚开始学C语言的时候,知 ...

  7. 负数转无符号运算 (-1对256取模)

    c++primer5遇到了这个-1对256取模,负数取模还真的不清楚,所以查了查资料,供大家参考. 原文是这样说的:C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表 ...

  8. java取模负数_JAVA中取模的问题

    ## Java取模(%)运算 > [上篇文章](https://yebukong.com/article/1101070795486109697.html "上篇文章") 提 ...

  9. python 除法取模_跟我一起学python | 探究05

    算术运算.比较运算.赋值运算.位和位运算.运算优先级 python里的算术运算 我们最熟悉的计算就是算术运算,加减乘除等.在python的算术运算中,除了四则运算外,还有幂运算.取模.取整运算. 什么 ...

最新文章

  1. apache并发测试工具ab为什么测不准
  2. jsp页面模块的来源
  3. dpkg: 錯誤: 分析檔案 '/var/lib/dpkg/updates/0001' 的第 0 行附近: 欄位名稱 `#padding' 中有換行
  4. 大型网站架构系列:电商网站架构案例(1)
  5. 【收藏】李纪为:初入NLP领域的一些小建议
  6. java语言实现二维数组构造二叉树_剑指offer打卡5:二叉树的子结构
  7. idea 调节背景护眼_IDEA 护眼色设置 背景行颜色取消等设置
  8. 红警2科技时代2.7正式版
  9. raid 物理盘缓存状态_查看RAID状态
  10. eclipse插件SonarLint点击deactivate rule后恢复
  11. Python 实现键鼠操作
  12. 电脑视频加水印怎么加?
  13. ARM Linux控制CDS5516
  14. 量化新手初识Brinson绩效分解模型
  15. 从入门到精通:学习编程的必要步骤
  16. 微型计算机的软 硬件组成,微型计算机的软、硬件组成及主要性能指标
  17. freetype2 使用
  18. 草稿-9206-盒子模型-
  19. OTG线是什么?手机和平板的OTG线怎么用?
  20. 365天英语口语学习_01,起床

热门文章

  1. html动态网页效果代码_教你制作网页的第一步
  2. 安装itunes需要管理员身份_ITUNES无法安装,提示没有权限如何解决?
  3. messagedigest 图片加密_MessageDigest 加密和解密2
  4. mysql数据库修改数据库名称_MySQL数据库之MySQL 修改数据库名称的一个新奇方法...
  5. boot界面上下键调节键不能动_为什么电脑一开机就自动进入BIOS界面
  6. PHP获取QQ等级,php仿QQ等级太阳显示函数
  7. 微信小程序入门三: 简易form、本地存储
  8. 面向过程 VS 面向对象
  9. CentOS SSH公钥登录问题
  10. find 命令搜索符号链接文件夹的方法