【发布时间】: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