我正在尝试构建此函数以便用户传递两个数字,并找到这两个数字的最低公倍数。我试图通过使用这个逻辑来构建函数。继续相乘,直到两个数字的结果相等。我需要一些关于逻辑的帮助。谢谢。
function performCalc(one, two) {
var num1 = new Number;
var num2 = new Number;
var i = new Number(0);
var num1 = one;
var num2 = two;
var result1 = new Number;
var result2 = new Number;
do {
result1 = num1 * i;
result2 = num2 * i;
i++
}
while (result1 != result2);
if (result1 == result2) {
return result1;
}
}
答案 0 :(得分:4)
这将始终返回0,因为i
从0
开始,因此result1
将为0而result2
将为0.
要查找LCM,您需要测试不同的产品组(例如,在LCM(12, 18)
的情况下,您需要将18
乘以2
和{{1} } 12
)。
一种方法是:
3
答案 1 :(得分:0)
您的解决方案存在的问题是,虽然result1
和result2
可能在不同时间持有相同的值,但它们只会在的同时共享相同的值 >您的原始输入one
和two
相同。因为返回条件依赖于这两个值的等价性,所以最终得到的函数仅在one==two
时返回。输入3
和5
的循环示例为
... ad infinitum,其中result1
永远不等于result2
。
更好的解决方案将采用值a
(其中a
是具有最低绝对值的参数)并重复将数字添加到自身,直到总和ret
完全可分由a
和b
组成。我们可以使用modulo operator来检查这种情况。这种方法还允许我们在必要时计算“负最低公倍数”:
function lowest_common_multiple(a,b) {
var max = Math.max(a,b),
min = Math.min(a,b);
if(Math.abs(max + min) <= Math.abs(max)) {
return 0;
}
var abs_min = (Math.abs(a) < Math.abs(b)) ? a : b;
var ret = abs_min;
while(1) {
ret += abs_min;
if(!(ret % a || ret % b)) {
return ret;
}
}
}
console.log(lowest_common_multiple(11,27)); // >> +297
console.log(lowest_common_multiple(-11,-27)); // >> -297
请注意,如果用户为任一(或两个)参数传入零,或者如果一个参数为正而另一个参数为负,则此实现返回零。
答案 2 :(得分:-2)
也许这会解决问题:
do {
result1 = num1 * i;
result2 = num2 * i;
if( result1 == result2 ){ break; }
i++
}
return result1;
看起来,你的代码是无限循环的,甚至可能用之类的东西来限制迭代
i++;
if( i > 1000 ){ result1=0; break; } //if it tried 1000 times and found nothing, abort and return zero...