C++ 和 Python 中 / 的区别

aa3*_*333 1 c++ 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
Run Code Online (Sandbox Code Playgroud)

这在测试用例中被拒绝:

Input:  ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output: 12
Expected: 22
Run Code Online (Sandbox Code Playgroud)

但如果我将操作的应用修改'/'stack.append(int(op2 / (op1*1.0))),它就会成功。

/操作在此输入计算上执行一次6/-132,导致-1使用两种方式中的任何一种。

奇怪的是,尽管两个评估的结果都是-1,但整个程序的输出却不同。如上所示,使用第一种方式给出12RPNEval,而使用第二种方式给出22。这是什么原因造成的?

我访问了这个链接/,但它只说Python和C++中的运算符存在一些差异。有什么不同?

hlt*_*hlt 5

如果您使用的是 Python 2,/则进行整数除法(也就是说,它会删除余数并只给出向下舍入的结果),除非至少有一个操作数的类型float不是int. 您可以通过乘以 来解决此问题1.0,但您也可以调用float(...)其中一个操作数。这与 C++ 类似,但是,在 C++ 中,结果向零舍入而不是向下舍入,这意味着您将通过一个负操作数收到不同的结果:

C++:

1 / 2       // gives 0
(-1) / 2    // also gives 0
Run Code Online (Sandbox Code Playgroud)

Python 2:

1 / 2       # gives 0
(-1) / 2    # gives -1 (-0.5 rounded down)
Run Code Online (Sandbox Code Playgroud)

Python 3:

在Python 3上,/总是进行正确的浮点除法,这意味着你总是得到一个float返回值,你可以用它//来恢复旧的行为

1 / 2       // gives 0
(-1) / 2    // also gives 0
Run Code Online (Sandbox Code Playgroud)

编辑添加:

由于您使用的是Python 2.7(请参阅编辑后的问题),因此您似乎确实陷入了整数除法的困境。要在 Python 2 中获得新的 Python 3 风格的行为,您还可以运行

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

在程序的开头(必须在最开始,否则口译员会抱怨)

关于的另一个编辑int(something)

请注意,整数除法向下舍,而整数转换则向零舍入,就像 C++ 中的整数除法一样。