5

非正数除法在 c++ 和 python 编程语言中完全不同:

//c++:
11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -3
(-11) % 3 = -2
11 / (-3) = -3
11 % (-3) = 2
(-11) / (-3) = 3
(-11) % (-3) = -2

因此,如您所见,c++ 正在最小化商。然而,python 的行为是这样的:

#python
11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -4
(-11) % 3 = 1
11 / (-3) = -4
11 % (-3) = -1
(-11) / (-3) = 3
(-11) % (-3) = -2

我不能编写自己的除法函数,其行为类似于 c++,因为我将使用它来检查 c++ 计算器程序,而 python 不支持中缀运算符。我可以让python表现得像c++一样,同时以简单的方式划分整数吗?例如,设置一些标志或类似的东西?

4

3 回答 3

3

正如 Thomas K 所说,使用math.fmod模数,或者如果你真的想要你可以自己定义它:

def cmod(x, y):
    return abs(x) % abs(y) * (1 if x > 0 else -1)

这个函数应该模拟 C 风格的除法:

def cdiv(x, y):
    return abs(x) / abs(y) * cmp(x, 0) * cmp(y, 0)

你说你必须使用/and%运算符。这是不可能的,因为您不能覆盖内置运算符的运算符。但是,您可以定义自己的整数类型和运算符重载__div__and__mod__运算符。

于 2011-05-21T21:37:09.510 回答
2

没有可以设置的标志来使 python 除法像 c++ 一样。

您建议您不能编写自己的除法函数,但如果您改变主意,您可以这样做:

def cpp_int_div(dividend, divisor):
    a, b = dividend, divisor
    sign = 1 if (a>0 and b>0) or (a<0 and b<0) else -1
    return (abs(a)/abs(b)) * sign

def cpp_int_mod(dividend, divisor): # or just use math.fmod  (from Thomas K)
    a, b = dividend, divisor
    sign = 1 if a>0 else -1
    return (abs(a)%abs(b)) * sign

这表明它根据您的规范行事:

print "11 / 3 = %d" % cpp_int_div(11,3)
print "11 %% 3 = %d" % cpp_int_mod(11,3)
print "(-11) / 3 = %d" % cpp_int_div(-11, 3)
print "(-11) %% 3 = %d" % cpp_int_mod(-11, 3)
print "11 / (-3) = %d" % cpp_int_div(11, -3)
print "11 %% (-3) = %d" % cpp_int_mod(11, -3)
print "(-11) / (-3) = %d" % cpp_int_div(-11, -3)
print "(-11) %% (-3) = %d" % cpp_int_mod(-11, -3)

这使:

11 / 3 = 3
11 % 3 = 2
(-11) / 3 = -3
(-11) % 3 = -2
11 / (-3) = -3
11 % (-3) = 2
(-11) / (-3) = 3
(-11) % (-3) = -2
于 2011-05-21T21:48:34.987 回答
0

您还应该从标准库中查看十进制模块。

十进制“基于一个以人为本设计的浮点模型,并且必然有一个最重要的指导原则——计算机必须提供一种与人们在学校学习的算术相同的算术。” – 十进制算术规范的摘录。

然而,结果

import decimal
decimal.divmod(-11, 3)
>>> (-4, 1)
于 2011-05-21T22:01:16.070 回答