[英]Difference between / in C++ and Python
使用Python 2.7
我正在尝试解决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
。 是什么原因造成的?
我访问了此链接 ,但它仅表示Python和C ++中的/
运算符有所不同。 有什么区别?
如果您使用的是Python 2,则/
整数除法(即,它会除掉余数并只给出四舍五入的结果),除非至少一个操作数的类型为float
而不是int
类型。 您可以通过乘以1.0
解决此问题,但是您也可以在其中一个操作数上调用float(...)
。 这类似于C ++,但是在C ++中,结果四舍五入为零而不是向下取整,这意味着使用一个负操作数将收到不同的结果:
1 / 2 // gives 0
(-1) / 2 // also gives 0
1 / 2 # gives 0
(-1) / 2 # gives -1 (-0.5 rounded down)
在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.