JavaScript函数将两个数字相乘,直到它们相等
我试图构建这个函数,让用户传递两个数字,并找到这两个数字的最小公倍数。我试图用这个逻辑来构建函数。继续乘法,直到两个数的结果相等为止。我需要一些逻辑方面的帮助。多谢各位JavaScript函数将两个数字相乘,直到它们相等,javascript,Javascript,我试图构建这个函数,让用户传递两个数字,并找到这两个数字的最小公倍数。我试图用这个逻辑来构建函数。继续乘法,直到两个数的结果相等为止。我需要一些逻辑方面的帮助。多谢各位 function performCalc(one, two) { var num1 = new Number; var num2 = new Number; var i = new Number(0); var num1 = one; var nu
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;
}
}
也许这会奏效:
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...
这将始终返回0,因为
i
从0
开始,因此result1
将为0,result2
将为0
要找到LCM,您需要测试不同的产品集(例如,在LCM(12,18)
的情况下,您需要将18
乘以2
和12
乘以3
)
一种方法是:
var i,j;
for(i=1;i <= two; ++i) {
for(j=1; j<=one; ++j) {
if(one * i == two * j) {
return one * i;
}
}
}
vari,j;
对于(i=1;i您的解决方案的问题是,虽然result1
和result2
可能在不同的时间持有相同的值,但只有当原始输入one
和two
相同时,它们才会在同一时间共享相同的值。因为您的返回条件依赖于这些值的等价性如果是两个值,则最终得到的函数只有在one==two
时才返回。输入3
和5
的循环示例如下
i=0,result1=0,result2=0
i=1,结果1=3,结果2=5
i=2,结果1=6,结果2=10
…无限大,其中result1
从不等于result2
更好的解决方案是取一个值A
(其中A
是绝对值最低的参数)并反复将该数字添加到自身中,直到总和ret
完全可被a
和b
整除。我们可以使用来检查这种情况。这种方法还允许我们计算“负最低公倍数”,如有必要:
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
功能最低\u公共\u倍数(a、b){
var max=数学最大值(a,b),
min=数学min(a,b);
如果(数学绝对值(最大+最小值)>+297
console.log(最低公共倍数(-11,-27));//>-297
请注意,如果用户为其中一个(或两个)传入零,则此实现将返回零参数,或者如果一个参数为正,而另一个参数为负。您的函数似乎没有返回任何内容。我认为您需要在do循环上测试result1而不是result2,然后中断它并返回输入数字x
和y
,您的函数将计算所有可能的x*k
和y*k
表示k
的所有值。但是x*k==y*k
只有当x==y
表示k
的所有值时才是真的(你可以通过将方程除以k
很容易看出这一点)。如果您想要最小公分母,则需要检查x/k
是否是一个整数,或者——在JS中--floor(num1/i)=(num1/i)
或者更快的,(num1%i)==0
。如果将结果乘以相同的数字,您如何期望结果是相同的?抱歉,刚刚注意到您希望LCM不是最低公分母。下面的Nirks答案应该涵盖这一点。此外,据我所知,新数字有缺陷,为什么不使用简单的零进行初始化,如var i=0,result1=0,result2=0;我不知道为什么他需要这个函数,也许是为了一些家庭作业……事实上,value1和value2永远不会相等,因为它们被乘以相同的数字(i)但我只是用看似无限的do循环加上我的两分钱。干杯。提问者要求一种算法来获得两个数字的LCM。@luiges90计算LCM有更有效的方法,比如用欧几里德方法计算GCD,然后计算1*2/GCD(1,2),但OP需要一种增量方法