2016-07-16 42 views
-1

我在JavaScript中工作,我正在解決最小公倍數,兩個數字,最小公倍數必須可以被兩個數字之間的所有數字整除。最小公倍數多重除以

現在,我的代碼根本不工作,沒有任何東西被返回。我有一個函數來計算最小公倍數和第二個函數來確定這個倍數是否可以被最小和最大數字之間的數字整除。

function smallestCommons(arr) { 

    var max = 0; 
    var min = 0; 
    var lcm = 0; 
    var max2 = 0; 
     if(arr[0]> arr[1]) { 
     max = arr[0]; 
     min = arr[1]; 
     } else { 
     max = arr[1]; 
     min = arr[0]; 
     } 

     function range(item){ 
     for(var j = min+1; j < max; j++){ 
      if(item % j !== 0){ 
      return 0; 
      } else { 
      return item; 
      } 
     } 
     } 
     function lcmFind(min1, max1){ 
     for(var i =1; i < min1; i++){ 
      max1 = max1 * i; 

      if(range(max1) === 0){ 
       continue; 
      } else { 
       return range(max1); 
      }  
      } 
     }   
     return lcmFind(min,max);  
    } 
    smallestCommons([1,5]); 
+1

你可以很容易地發現這一點,如果你做了一個小調查 –

+0

有大量的代碼在互聯網上計算lcm。我的程序是計算lcm,它也可以被最小和最大的數字整除。 –

+0

那麼你不能稱之爲LCM。兩個給定數字只能有一個LCM。任何需要第三個條件的情況都不稱爲LCM。 –

回答

4

您正在尋找lcm或最小公倍數。恰巧lcm(a, b) = a * b/gcd(a, b)其中gcd是最大公約數,這兩個數字都是最大公倍數。有一種稱爲歐幾里德算法的算法用於快速計算gcd:gcd(a, b) = gcd(b, a % b)其中a%ba modulo b。在JavaScript中,這是。

function gcd(a, b) { 
    if (b == 0) { 
     return a; // so that the recursion does not go on forever 
    } else { 
     return gcd(b, a % b); 
    } 
} 

然後,你可以像這樣定義lcm。

function lcm(a, b) { 
    return a * b/gcd(a, b); 
} 

編輯:爲了計算一個數字列表lcm,只需減少與lcm函數。所以爲了計算一個範圍內所有數字的lcm,這個代碼將起作用。 (假設範圍包含了2個參數)

function lcmOfRange(a, b) { 
    var range = []; 
    for (var i = a; i <= b; i++) { 
     range.push(i); 
    } 
    return lcmOfList(range); 
} 

function lcmOfList(arr) { 
    return arr.reduce(lcm); 
} 

這相當於

function lcmOfRange(a, b) { 
    var result = a; 
    for (var i = a + 1, i <= b; i++) { 
     result = lcm(result, i); 
    } 
    return result; 
} 
+0

我發現了上一個計算lcm的問題。在互聯網上還有很多用於計算lcm的代碼。我的程序是計算lcm,它也可以被最小和最大的數字整除。 –

+0

@DanielSemel我編輯了我的答案,以顯示如何獲取列表的lcm。 – afuous

+0

好的,謝謝。 –