我想写一个函数来找到给定乘数的下一个数字的倍数。源数和乘数都可以是浮点数。
预期:
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;
}
}
我不喜欢多次铸造。是否有更有效的方法或现有的库解决方案可以做到这一点?
答案 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;
这适用于所有测试用例......