如何将数字四舍五入到另一个数字的倍数?

时间:2016-04-12 00:13:21

标签: c++ algorithm modulo integer-division

我尝试设计一个函数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取代。

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

2 个答案:

答案 0 :(得分:1)

如果您想避免跳跃,请尝试:

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

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

答案 1 :(得分:-2)

((number / divisor)  + 1) * divisor)

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

如果您打算使用花车:  floor(number / divisor)