2014-03-02 28 views
4

我剛剛開始JS,並理解找到一個因素的概念。然而,這段代碼是我迄今爲止所做的。我有一個str變量,只輸出第一個因子2,我試圖將每個(int)作爲一系列因子添加到str中。下面的代碼片段有什麼問題?試圖找到一個數字在JS的因素

function calculate(num) { 
    var str = ""; 
    var int = 2; 
    if (num % int == 0) { 
     str = str + int; 
     int++; 
    } else { 
     int++; 
    } 
    alert(str); 
} 

calculate(232); 
+3

爲了運行因子代碼不止一次,你會需要一些類型的循環,正確的? –

+0

你只是測試一個值。 – Pointy

+1

使用'遞歸'來尋找因子.. –

回答

7

function calculate(num) { 
 
    var str = "0"; 
 
    for (var i = 1; i <= num; i++) { 
 
     if (num % i == 0) { 
 
      str += ',' + i; 
 
     } 
 
    } 
 
    alert(str); 
 
} 
 

 
calculate(232);

http://jsfiddle.net/67qmt/

8

@ Moob的答案是正確的。您必須使用循環。但是,您可以通過確定每個數字是偶數還是奇數來加速該過程。奇數不需要像evens那樣檢查每個數字。奇數可以檢查對其他號碼。此外,我們不需要檢查過去一半的數字,因爲沒有一半以上的數據可以工作。不包括0和1開始:

function calculate(num) { 

    var half = Math.floor(num/2), // Ensures a whole number <= num. 
     str = '1', // 1 will be a part of every solution. 
     i, j; 

    // Determine our increment value for the loop and starting point. 
    num % 2 === 0 ? (i = 2, j = 1) : (i = 3, j = 2); 

    for (i; i <= half; i += j) { 
     num % i === 0 ? str += ',' + i : false; 
    } 

    str += ',' + num; // Always include the original number. 
    alert(str); 
} 

calculate(232); 

http://jsfiddle.net/r8wh715t/

雖然我你的具體情況瞭解(計算232)的運算速度是不是一個因素(< - 沒有雙關語意),它可能成爲更大數量或多次計算的問題。我正在研究Project Euler problem #12,我需要這種類型的功能,並且計算速度至關重要。

+0

您可以通過將for循環與'i * i <= num'而不是'i <= half'進行比較,並使用'i'的值來計算其配對因素。計算(300)從+ -150迭代到15 – Larry

+1

備選在這裏:http://stackoverflow.com/a/43204663/895007 – Larry

+0

我建議不要在這裏使用三元運算符,只需使用if語句。 –

0
function factorialize(num) { 
var result = ''; 
    if(num === 0){ 
    return 1; 
    }else{ 
    var myNum = []; 

    for(i = 1; i <= num; i++){ 
    myNum.push(i); 
    result = myNum.reduce(function(pre,cur){ 
     return pre * cur; 
    }); 
    } 
    return result; 
    } 
} 

factorialize(9); 
3

作爲更高性能的補充@的-quodesmith的answer,一旦你有一個因素,你立刻知道什麼它配對的產品是:

function getFactors(num) { 
    const isEven = num % 2 === 0; 
    let inc = isEven ? 1 : 2; 
    let factors = [1, num]; 

    for (let curFactor = isEven ? 2 : 3; Math.pow(curFactor, 2) <= num; curFactor += inc) { 
    if (num % curFactor !== 0) continue; 
    factors.push(curFactor); 
    let compliment = num/curFactor; 
    if (compliment !== curFactor) factors.push(compliment); 
    } 

    return factors; 
} 

getFactors(300)這將只運行循環15倍,相對於原來的+ -150。

+1

您可能會考慮'for'循環中的一個不同條件,以避免通過使用['Math.sqrt()'](https://developer.mozilla.org/zh-CN)爲每次運行調用'Math.pow美國/文檔/網絡/的JavaScript /參考/ Global_Objects /數學/開方)。人們可以使用'常量根= Math.sqrt(NUM);'循環之前和在'for'條件使用'curFactor <= root'。 – Nicholas

4

ES6版本:

const factors = number => Array 
    .from(Array(number), (_, i) => i) 
    .filter(i => number % i === 0) 

console.log(factors(36));  // [1, 2, 3, 4, 6, 9, 12, 18] 

https://jsfiddle.net/1bkpq17b/

陣列(數)創建的[數字]放置一個空數組

Array.from(ARR,(_,i)的=> i)根據位置[0,1,2,3,4,5,6,7,8,9]填充空數組,數值爲

.filter(i => ...)將填充的[0,1,2,3,4,5]數組過濾爲滿足數字%i === 0的條件的元素,只留下數字這是原始數字的因素。

請注意,如果您處理大數字(或小數字),您可以直到Math.floor(數字/ 2)出於提高效率的目的。

+0

一些解釋會很好。 –

+1

+ Fred Gandt已添加。 – Guy

+0

謝謝。它很漂亮和有用:-) –

-1
function factorialize(num) { 
if(num === 0) 
    return 1; 
var arr = []; 
for(var i=1; i<= num; i++){ 
    arr.push(i); 
} 
num = arr.reduce(function(preVal, curVal){ 
    return preVal * curVal; 
}); 

    return num; 
} 

factorialize(5); 
+0

雖然這段代碼可能回答這個問題,但提供關於如何和/或爲什麼它解決問題的額外上下文會改善答案的長期值。 – Badacadabra

+0

問題在於詢問一個數字的因素,而不是因子化。 – Vincent

0

我進來factoring quadratic equations尋找一種算法,這種使用,這意味着我需要考慮正反兩方面的數字和因素。下面的函數做到這一點,並返回一系列因子對。 Fiddle

function getFactors(n) { 
    if (n === 0) {return "∞";} // Deal with 0 
    if (n % 1 !== 0) {return "The input must be an integer.";} // Deal with non-integers 

    // Check only up to the square root of the absolute value of n 
    // All factors above that will pair with factors below that 
    var absval_of_n = Math.abs(n), 
     sqrt_of_n = Math.sqrt(absval_of_n), 
     numbers_to_check = []; 
    for (var i=1; i <= sqrt_of_n; i++) { 
    numbers_to_check.push(i); 
    } 

    // Create an array of factor pairs 
    var factors = []; 
    for (var i=0; i <= numbers_to_check.length; i++) { 
    if (absval_of_n % i === 0) { 
     // Include both positive and negative factors 
     if (n>0) { 
     factors.push([i, absval_of_n/i]); 
     factors.push([-i, -absval_of_n/i]); 
     } else { 
     factors.push([-i, absval_of_n/i]); 
     factors.push([i, -absval_of_n/i]); 
     } 
    } 
    } 

    // Test for the console 
    console.log("FACTORS OF "+n+":\n"+ 
       "There are "+factors.length+" factor pairs."); 
    for (var i=0; i<factors.length; i++) { 
    console.log(factors[i]); 
    } 

    return factors; 
} 

getFactors(-26); 
0
function calculate(num){ 
    var str = "0" // initializes a place holder for var str 
     for(i=2;i<num;i++){  
     var num2 = num%i; 
     if(num2 ==0){  
      str = str +i; // this line joins the factors to the var str 
     } 
    } 
    str1 = str.substr(1) //This removes the initial --var str = "0" at line 2 
    console.log(str1) 
} 
calculate(232); 

//Output 2482958116