给定乘数的下一个数字的倍数

时间:2014-09-23 18:32:41

标签: java algorithm function math double

我想写一个函数来找到给定乘数的下一个数字的倍数。源数和乘数都可以是浮点数。

预期:

nextMult(3.654,0.5) = 4.0
nextMult(3.165,0.15) = 3.30
nextMult(3.452,0.002) = 3.452
nextMult(2, 0.3) = 2.1
nextMult(2, 0.2) = 2
nextMult(4, 3) = 6

我目前的解决方案:

public double nextMult(double source, double multiplier)
{
    for (double i = (double)((long)source - multiplier); i <= source + multiplier; 
        i += multiplier) 
    {
        if (i >= source) 
            return i;
    }
}

我不喜欢多次铸造。是否有更有效的方法或现有的库解决方案可以做到这一点?

2 个答案:

答案 0 :(得分:2)

是的。由于您已经提供了一个可行的解决方案,您会注意到您已经提出了一个O(n)解决方案,该解决方案经过了一定数量的操作,并且在您找到它之前似乎会增加。当你这样做时,这变得可怕nextMult(10000000000000, 1);我们整天都在这里手动迭代循环。

然而,实际上存在O(1)解决方案。

int multiple = (int) (source / multiplier); //we get the whole number portion of the divided value, i.e. 4/3 = 1, 3.654/0.5 = 7
double remainder = source % multiplier; //we need to check for if it matches the higher
if(remainder > 0) {
    multiple++; // and we want the next higher one
}
return multiplier * multiple;

话虽如此,这只会处理积极的价值。 我会将负值作为练习处理。

编辑:您需要为模数实现BigDoubles。双打和模数显然互相讨厌。

答案 1 :(得分:1)

源和乘数都是类型:double

double result = Math.ceil(source/multiplier) * multiplier;

这适用于所有测试用例......