[英]Difference between / in C++ and Python
使用Python 2.7
我正在嘗試解決LeetCodeOJ上的反向波蘭語表示法問題。
我用Python編寫了簡單的解決方案,如下所示:
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
stack = []
for token in tokens:
if token in ["+" , "-" ,"*", "/"]:
op1 = stack.pop()
op2 = stack.pop()
if token == "+":
stack.append(op2+op1)
elif token == "-":
stack.append(op2-op1)
elif token == "*":
stack.append(op2*op1)
elif token == "/":
stack.append(op2/op1)
else:
stack.append(int(token))
if len(stack) == 1:
return stack.pop()
else:
return 0
這在測試案例中被拒絕:
Input: ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output: 12
Expected: 22
但是如果我將'/'
操作的應用程序修改為stack.append(int(op2 / (op1*1.0)))
,它將成功。
對此輸入計算6/-132
進行一次/
操作,使用兩種方法之一得出-1
。
奇怪的是,盡管兩個評估結果均為-1
,但該程序的整體輸出卻有所不同。 如上所示,使用第一種方法將獲得12
作為RPNEval,而使用第二種方法將獲得22
。 是什么原因造成的?
我訪問了此鏈接 ,但它僅表示Python和C ++中的/
運算符有所不同。 有什么區別?
如果您使用的是Python 2,則/
整數除法(即,它會除掉余數並只給出四舍五入的結果),除非至少一個操作數的類型為float
而不是int
類型。 您可以通過乘以1.0
解決此問題,但是您也可以在其中一個操作數上調用float(...)
。 這類似於C ++,但是在C ++中,結果四舍五入為零而不是向下取整,這意味着使用一個負操作數將收到不同的結果:
1 / 2 // gives 0
(-1) / 2 // also gives 0
1 / 2 # gives 0
(-1) / 2 # gives -1 (-0.5 rounded down)
在Python 3上, /
總是進行正確的浮點除法,這意味着您總是會返回float
,可以使用//
恢復舊的行為
1 / 2 # gives 0.5
(-1) / 2 # gives -0.5
1 // 2 # gives 0
(-1) // 2 # gives -1
由於您使用的是python 2.7(請參閱已編輯的問題),因此確實確實是您遇到的整數除法問題。 要在Python 2中獲得新的Python 3樣式行為,您還可以運行
from __future__ import division
在程序的開始 (必須在開始時,否則解釋器會抱怨)
int(something)
另一種編輯 要注意的是雖然整數除法向下舍入,轉換為整數輪朝向零 ,象整數除法在C ++中。
Python /
和C ++ /
之間只有兩個主要區別。
首先,對於負數,Python會向負無窮大四舍五入; C ++取整為0。因此,在Python中, -10 / 3
為-4,在C ++中通常為-3。
第二,在Python 3.x或與Python 2.x的from __future__ import division
,潛水兩個整數與/
給你一個float
,所以9 / 3
是3.0在Python 3.x中,但在3 C ++或Python 2.x的。
那么,如果要在Python中進行C ++樣式划分怎么辦? 好吧, int
函數總是四舍五入,而不是負無窮大。 因此,如果您強迫它進行浮點除法,然后對結果調用int
,而不是將其進行整數除法,您將獲得與C ++中相同的結果。 這就是您鏈接到的代碼使用int(b/(a*1.0))
。 我不確定這是最好的寫法(尤其是沒有評論要點的評論),但這就是它的用處。
同時,如果您真的想看看為什么會有所不同,請嘗試在調試器或聯機可視化程序中運行代碼,或者只是在eval循環的每個步驟中添加print
調用。 然后,您可以確切地看到出錯的步驟-參數是什么,輸出是什么,以及您期望輸出是什么。 然后,您可以將問題簡化為一個簡單得多的問題,例如:
a = 4
b = -13
print(b/a)
print(int(b/(a*1.0)))
然后要弄清楚為什么它們不同,將int(b/(a*1.0))
分解為幾個步驟:
print(a*1.0)
print(b/(a*1.0))
print(int(b/(a*1.0)))
在C ++中,如果將兩個整數相除,則會得到一個整數,四舍五入為零。 例如,
1 / 2 = 0
-1 / 2 = 0
但是,如果至少有一個參數為浮點數,則結果為浮點數。 在python2中,對於整數參數/將進行整數除法,例如四舍五入
1 / 2 = 0
-1 / 2 = -1
在python3中,他們更改了/的行為,但並非總是進行浮點除法
1 / 2 = 0.5
如果要在python3中進行整數除法,可以使用//運算符
1 // 2 = 0
-1 // 2 = -1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.