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。
结论
根据例子及推理。得出如下总结:
- 当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 取余相关推荐
- python 除数总是提示为0_Python错误的处理方法
异常的捕获与处理 什么是错误 简而言之:还没运行,在语法解析的时候,就发现语法存在问题,这个时候就是错误. 什么是异常 简而言之:代码写好之后,无明显语法错误(这个时候,编辑器不知道有错,语法解析时也 ...
- python中除法(/)、取模(%)、取整除(//)、幂(**)运算
文章目录 除法("/") 运算 取模("%")运算 取整除("//")运算 幂运算 除法("/") 运算 #除法运算 i ...
- C语言大数阶乘取余,python中math模块常用函数介绍 取模(取余)取绝对值 求阶乘 求最大公约数最小公倍数 取对数 取根号 取幂(取次方) 取整函数 三角函数与反三角函数...
前提:import math 两个常用常量 e = 2.718281828459045 pi = 3.141592653589793 >>> import math >> ...
- 程序员数学基础【三、取模运算(取余运算功能重叠部分)】(Python版本)
测试使用语言:[Python] 由于此类语言入门非常容易,哪怕初中生亦可以,并且本科/研究生写论文.做实验多数所用语言都是[Python]故而选择此语言. 代码运行平台:[win10 x64] 代码环 ...
- python负数取模_负数的取模运算
我们知道,在不同的语言中,对负数执行取模运算,结果有可能会是不同的.例如,(-11)%5在python中计算的结果是4,而在C(C99)中计算的结果则是-1. truncate除法 && ...
- 【C语言】深度理解 负数取余 取模
C语言深度理解 负数取余 取模 关于取余和取模的问题 定义 取余时有负数怎么计算? 取余和取模的区别 取余和取模时候等价什么时候不等价 总结 关于取余和取模的问题 许多小伙伴在刚开始学C语言的时候,知 ...
- 负数转无符号运算 (-1对256取模)
c++primer5遇到了这个-1对256取模,负数取模还真的不清楚,所以查了查资料,供大家参考. 原文是这样说的:C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表 ...
- java取模负数_JAVA中取模的问题
## Java取模(%)运算 > [上篇文章](https://yebukong.com/article/1101070795486109697.html "上篇文章") 提 ...
- python 除法取模_跟我一起学python | 探究05
算术运算.比较运算.赋值运算.位和位运算.运算优先级 python里的算术运算 我们最熟悉的计算就是算术运算,加减乘除等.在python的算术运算中,除了四则运算外,还有幂运算.取模.取整运算. 什么 ...
最新文章
- apache并发测试工具ab为什么测不准
- jsp页面模块的来源
- dpkg: 錯誤: 分析檔案 '/var/lib/dpkg/updates/0001' 的第 0 行附近: 欄位名稱 `#padding' 中有換行
- 大型网站架构系列:电商网站架构案例(1)
- 【收藏】李纪为:初入NLP领域的一些小建议
- java语言实现二维数组构造二叉树_剑指offer打卡5:二叉树的子结构
- idea 调节背景护眼_IDEA 护眼色设置 背景行颜色取消等设置
- 红警2科技时代2.7正式版
- raid 物理盘缓存状态_查看RAID状态
- eclipse插件SonarLint点击deactivate rule后恢复
- Python 实现键鼠操作
- 电脑视频加水印怎么加?
- ARM Linux控制CDS5516
- 量化新手初识Brinson绩效分解模型
- 从入门到精通:学习编程的必要步骤
- 微型计算机的软 硬件组成,微型计算机的软、硬件组成及主要性能指标
- freetype2 使用
- 草稿-9206-盒子模型-
- OTG线是什么?手机和平板的OTG线怎么用?
- 365天英语口语学习_01,起床
热门文章
- html动态网页效果代码_教你制作网页的第一步
- 安装itunes需要管理员身份_ITUNES无法安装,提示没有权限如何解决?
- messagedigest 图片加密_MessageDigest 加密和解密2
- mysql数据库修改数据库名称_MySQL数据库之MySQL 修改数据库名称的一个新奇方法...
- boot界面上下键调节键不能动_为什么电脑一开机就自动进入BIOS界面
- PHP获取QQ等级,php仿QQ等级太阳显示函数
- 微信小程序入门三: 简易form、本地存储
- 面向过程 VS 面向对象
- CentOS SSH公钥登录问题
- find 命令搜索符号链接文件夹的方法