0

ユーザーが2つの数値を渡すようにこの関数を構築しようとしており、2つの数値の最小公倍数を見つけています。このロジックを使用して関数を構築しようとしていました。2 つの数値の結果が互いに等しくなるまで乗算を続けます。ロジックに関するヘルプが必要です。ありがとうございました。

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;
        }
    }
4

3 に答える 3

0

ソリューションの問題は、result1とが異なる時点で同等の値を保持している可能性がありますが、元の入力とが同一である場合result2にのみ、同時に同じ値を共有することです。return 条件はこれら 2 つの値の同等性に依存しているため、 の場合にのみ返す関数になります。入力を使用したループの例は、次のようになります。onetwoone==two35

  1. i = 0、結果 1 = 0、結果 2 = 0
  2. i = 1、結果 1 = 3、結果 2 = 5
  3. i = 2、結果 1 = 6、結果 2 = 10

...result1と等しいことはありませんresult2

より良い解決策は、値a(aは最小の絶対値を持つ引数) を取り、合計が と の両方でret完全に割り切れるまで、その数値を繰り返し加算します。モジュロ演算子を使用して、この状態を確認できます。このアプローチにより、必要に応じて「負の最小公倍数」を計算することもできます。ab

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

ユーザーがいずれか (または両方) の引数にゼロを渡した場合、または一方の引数が正で他方が負の場合、この実装はゼロを返すことに注意してください。

于 2013-10-11T05:51:14.013 に答える
-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...
于 2013-10-11T04:59:47.250 に答える