如何在整数算术中执行上限除法? [复制]
Posted
技术标签:
【中文标题】如何在整数算术中执行上限除法? [复制]【英文标题】:How to perform ceiling-division in integer arithmetic? [duplicate] 【发布时间】:2015-10-23 09:32:29 【问题描述】:它基本上是返回 box_needed。 1 个盒子可以包含 10 件物品。因此,如果用户键入的项目是 102,那么代码应该返回 11 个框。
如果有非零余数,有没有办法向上舍入?
【问题讨论】:
这就是你想要的ceil(10.4)
使用“将地板除法转换为天花板除法运算符”,拼写为“--0--” 用法示例:--0-- 102//10
-> 11
。 (试试看!)</tongue-in-cheek>
。更严重的是,这只是 Stefan Pochmann 答案的变体,它不仅为整数提供了正确的结果,而且还正确扩展到其他数字类型,例如 float
和 Fraction
。
对于解析这个的其他人:它解析为- (-0) - (-102)//10
。使用0-- 102//10
可以达到相同的效果。 --102//10
失败,因为它解析为 (- ( - 102)) // 10
。
【参考方案1】:
对于您的用例,请使用整数算术。有一种简单的技术可以将整数地板除法转换为天花板除法:
items = 102
boxsize = 10
num_boxes = (items + boxsize - 1) // boxsize
或者,使用否定将地板分割转换为天花板分割:
num_boxes = -(items // -boxsize)
【讨论】:
我认为我们的讲师希望我们使用这种技术而不是使用 ceil,因为 ceil 尚未在讲座中介绍。谢谢:) 这个答案对我来说不是很清楚 - 可能是因为问题不是很清楚,也许这有助于澄清显示的内容,使用上面变量名称的值,102 / 10 是 10.2 ;使用整数除法,102 // 10 是 10,但是在不使用数学库或浮点数的情况下向上舍入到 11 则上述任一解决方案都有效,因此这两个都将给出 11:(102 + 10 - 1) // 10或 -(102 // -10) 如果您需要了解为什么需要 -1,请考虑 100 和 101 会发生什么【参考方案2】:前后取反?
>>> -(-102 // 10)
11
【讨论】:
我认为这个解决方案比“添加分母 - 1”的解决方案更好,因为它无需修改即可扩展到浮点数。【参考方案3】:from math import ceil
print(ceil(10.3))
11
【讨论】:
不要那样做!一旦你使用浮点运算,你就会让不准确的恶魔进来。它可以在正常用例中工作,但如果你开始使用长数字(二进制表示中超过 48 位)整数不能用 IEE-754 精确表示双精度数。 我会记住这一点【参考方案4】:你可以试试:
import math
math.ceil( x )
【讨论】:
以上是关于如何在整数算术中执行上限除法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在javascript中进行整数除法(在int中获取除法答案而不是float)? [复制]