C ++和Python之间的区别

时间:2014-08-11 05:34:09

标签: python c++

使用Python 2.7

我试图解决LeetCodeOJ上的反向波兰表示法问题。

RPN on 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。 是什么原因造成的?

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

3 个答案:

答案 0 :(得分:3)

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

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)

的另一个编辑

请注意,当整数除法舍入 down 时,转换为整数舍入朝零,就像C ++中的整数除法一样。

答案 1 :(得分:1)

Python /和C ++ /之间只有两个主要区别。

首先,对于负数,Python向负无穷大方向发展; C ++向0舍入。因此,-10 / 3在Python中为-4,在C ++中为-3(通常)。

其次,在Python 3.x或带有from __future__ import division的Python 2.x中,使用/跳过两个整数会得到float,因此9 / 3为3.0 in Python 3.x,但在C ++或Python 2.x中为3。

那么,如果你想在Python中进行C ++样式划分呢?好吧,int函数总是向0舍入,而不是负无穷大。因此,如果你强制它进行浮点除法,那么在结果上调用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)))

答案 2 :(得分: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