繁体   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