簡體   English   中英

C ++和Python中/之間的區別

[英]Difference between / in C++ and Python

使用Python 2.7

我正在嘗試解決LeetCodeOJ上的反向波蘭語表示法問題。

在LeetCodeOJ上的RPN

我用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 ++中,結果四舍五入為零而不是向下取整,這意味着使用一個負操作數將收到不同的結果:

C ++:

1 / 2       // gives 0
(-1) / 2    // also gives 0

Python 2:

1 / 2       # gives 0
(-1) / 2    # gives -1 (-0.5 rounded down)

Python 3:

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM