Java 给定乘数的下一个倍数
我想写一个函数,在给定乘数的情况下,求出一个数的下一个倍数。源数字和乘法器都可以是浮点 预期:Java 给定乘数的下一个倍数,java,algorithm,function,math,double,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
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;
}
}
public double nextMult(双源,双倍增)
{
对于(double i=(double)((长)源-乘数);i=源)
返回i;
}
}
我不喜欢多重铸件。是否有更有效的方法或现有的库解决方案可以做到这一点?是的。既然您已经提供了一个有效的解决方案,您会注意到您已经提供了一个O(n)解决方案,该解决方案经历了一系列操作,并且在找到它之前似乎一直在递增。当您执行
nextMult(100000000000,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;
也就是说,这只处理正值。我将把处理负值作为练习留给您
编辑:您将需要为模数实现BigDouble。double和module显然彼此讨厌。源和乘法器都属于double类型
double result = Math.ceil(source/multiplier) * multiplier;
这适用于所有测试用例…nextMult(100000000000,1);将仅通过我的解决方案迭代一次。此外,此解决方案不适用于我的测试用例nextMult(4,3)=6@Rohit我刚刚测试了我的盒子和4,3的作品。使用双精度模数时出现问题,但使用BigDecimal
而不是double
应该可以解决问题。已尝试编辑的答案。。。由于某种原因,下一个结果(3.452,0.002)给出了3.454。。。谢谢。是的,这很有效。只需将第二个源代码更改为乘数。