【问题标题】:How to round up an number to a multiple of another number? [duplicate]如何将一个数字四舍五入为另一个数字的倍数? [复制]
【发布时间】:2016-08-02 08:50:33
【问题描述】:

我正在尝试设计一个函数int smallestDivisibleAfter(int number, int divisor),使其返回大于或等于number 的最小数字,该数字可以被divisor(非零)整除。这里假设所有的输入和输出都是非负的。

例子:

smallestDivisibleAfter(9,4); // Returns 12
smallestDivisibleAfter(16,2); // Returns 16

我想出了代码number + divisor - number % divisor。然而,当number % divisor == 0 时,这将停止工作,从那时起smallestDivisibleAfter(16,2); // Returns 18 而不是16

此外,number - 1 + divisor - (number - 1)% divisor 不起作用,因为当我将此代码付诸实施时,int 将被 unsigned long long 替换。

这里最好的解决方案是什么?

【问题讨论】:

  • divisor * ((number / divisor) + (number % divisor ? 1 : 0))?
  • (number + divisor - 1) / divisor * divisor ?
  • 您的问题与您的示例不一致——18 是“大于 16 且可被 2 整除的最小数”,而 16 则不是。
  • @PaulHankin 这里更大被解释为>=
  • AlexD's 似乎是最简单的方法。

标签: c++ algorithm modulo integer-division


【解决方案1】:

如果你想避免跳跃,试试:

number - number % divisor + divisor * !!(number % divisor)

!!x 只是将数字转换为布尔值,如果 x==0 则为 0,否则为 1。

【讨论】:

  • 你确定 !! 可以在没有分支的情况下在装配级别做到这一点吗?
  • @MarkB 如果我们谈论的是 x86,这将是一个简单的 setnz。我在这里错过了什么吗?
  • 啊,一点也不,我只是不太熟悉 x86 程序集。
【解决方案2】:
((number / divisor)  + 1) * divisor)

这将返回数字之后除数的下一个最大倍数。

如果您打算使用浮点数: floor(number / divisor).

【讨论】:

  • 整数除法不会产生浮点数; floor() 没有什么。
  • 一个小建议:最好在发布之前对您的答案充满信心。回答的目的不是尽快猜出正确的答案,而是提供一个其他人可以阅读和理解的正确且令人信服的答案。
  • 是的,我刚刚编辑了那个,本来我没有打扰地板,然后添加它以防他决定使用浮动
  • 这是不正确的,因为如果number 已经被divisor 整除,它将返回number + divisor
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多