C++与Python之间的区别

2024-07-01 07:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python2.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

这在测试用例中被拒绝:

^{pr2}$

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

在这个输入计算/上执行一次6/-132操作,结果是使用两种方法中的任何一种。在

奇怪的是,尽管两个计算结果都是-1,但程序作为一个整体,其输出是不同的。如上所示,使用第一种方法将12作为RPNEval,而使用第二种方法将得到22。 是什么原因造成的?在

我访问了这个link,但它只表示在Python和C++中^ {< CD3>}运算符有一些不同。有什么区别?在


Tags: 方法intokenreturnifstackpopelse
3条回答

如果您使用python2,/执行整数除法(也就是说,它去掉余数,只给出向下取整的结果),除非至少有一个操作数是float而不是{}类型。通过与1.0相乘来修复此问题,但也可以对其中一个操作数调用float(...)。这与C++类似,但是C++中,结果是“0”,而不是>EME>,意味着你将得到不同的结果,其中一个负操作数:

C++:
1 / 2       // gives 0
(-1) / 2    // also gives 0

Python 2:

^{pr2}$

Python 3:

在Python3上,/总是执行正确的浮点除法,这意味着您总是得到一个float的返回,您可以使用//来恢复旧的行为

1 / 2       # gives 0.5
(-1) / 2    # gives -0.5

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

编辑后添加:

由于您使用的是Python2.7(请参阅编辑后的问题),因此它似乎确实是您所坚持的整数除法。要在python2中获得新的python3风格的行为,还可以运行

from __future__ import division

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

关于int(something)

谨防整数除法< EM >向下EEE>,转换为整数圆,如C++中的整数除法。在

介于Python ^ {CD1>}和C++ +{}之间有两个主要区别。在

首先,对于负数,Python向负无穷大旋转;C++向0轮旋转。因此,^ {CD3}}在Python中为-4,在C++中为-3(通常)。在

第二,在Python 3 .x或Python 2 .x中,^ ^ },跳转的两个整数与{{CD1>}给你一个^ {CD6>},所以^ {{CD7}}在Python 3 .x中为3,但是在C++或Python 2中为3。

那么,如果你想在Python中使用C++风格划分呢?那么,int函数总是向0取整,而不是负无穷大。因此,如果强制它执行浮点除法,则调用结果上的{{ CD8}},而不是将其放在整数除法中,将得到与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))分解为以下步骤:

^{pr2}$
在C++中,如果你把两个整数分开,你就得到一个整数,舍入零。例如

1 / 2 = 0
-1 / 2 = 0

但是如果至少有一个参数是浮点的,那么结果就是浮点。 在python2中,对于整型参数/将执行整数除法,例如向下取整

^{pr2}$

在python3中,它们改变了/的行为,但它并不总是进行浮点除法

1 / 2 = 0.5

如果要在python3中使用整数除法,可以使用//operator

1 // 2 = 0
-1 // 2 = -1

相关问题 更多 >

    热门问题