python 除数总是提示为0_python负数求余不正确?——取模 VS 取余
生活随笔
收集整理的這篇文章主要介紹了
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 = -3python3下的整除與求余
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;
計算?;蛘哂鄶?#xff1a; 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。
結論
根據例子及推理。得出如下總結:
2. 當符號不一致時,結果不一樣。求模運算結果的符號和b一致,求余運算結果的符號和a一致。
經過測試,在C/C++, C#, JAVA, PHP這幾門主流語言中,%運算符都是做取余運算,而在python中的%是做取模運算。
擴展:維基百科的相關解釋
維基百科-模除?zh.wikipedia.org編程語言中,取余和取模的區別到底是什么??www.zhihu.comleetcode實例
整數反轉 - 力扣(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 取余的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Save as PDF/X-3/4/5
- 下一篇: Python 安装库文件 is not