2015-11-23 41 views
0

我的結果數介於1和28321(限)項目歐拉中排名第23 JS

  • 和所有的數字:395465626
  • 所有豐富的數字之和:392188885
  • 所有非豐富的總和數字:(正確答案是4179871)

var divisors = function(number){ 
 
sqrtNumber = Math.sqrt(number); 
 
var sum = 1; 
 
for(var i = 2; i<= sqrtNumber; i++) 
 
{ 
 
    if (number == sqrtNumber * sqrtNumber) 
 
    { 
 
     sum += sqrtNumber; 
 
     sqrtNumber--; 
 
    } 
 
    if(number % i == 0) 
 
    { 
 
     sum += i + (number/i); 
 
    }  
 
} 
 
    
 
    if (sum > number) {return true;} 
 
    else {return false;} 
 
}; 
 

 
var abundent = [], k = 0; 
 
var upperLimit = 28123; 
 
for (var i = 1; i <= upperLimit; i++) 
 
{ 
 
\t if (divisors(i)) 
 
    {abundent[k] = i; k++}; 
 
    
 
} 
 

 
var abundentCount = abundent.length; 
 
var canBeWrittenAsAbundant = []; 
 
for (var i = 0; i < abundentCount; i++){ 
 
    for (var j = i; j < abundentCount; j++){ 
 
     if (abundent[i] + abundent[j] <= upperLimit){canBeWrittenAsAbundant[abundent[i]+abundent[j]] = true;} 
 
    else { 
 
     break; 
 
     \t } 
 
    \t } 
 
} 
 

 
for (i=1; i <= upperLimit; i++){ 
 
    if (canBeWrittenAsAbundant[i] == true){continue;} 
 
    else {canBeWrittenAsAbundant[i] = false;} 
 
} 
 

 
var sum = 0; 
 
for (i=1; i <= upperLimit; i++) 
 
{ 
 
    
 
    if (!canBeWrittenAsAbundant[i]){ 
 
     sum += i; 
 
    } 
 
} 
 

 
console.log(sum);
我使用 http://www.mathblog.dk/project-euler-23-find-positive-integers-not-sum-of-abundant-numbers/作爲指導,但我的結果不同。我是編程界的一個非常棒的新手,所以請記住這一點。

回答

0

你不需要使用週期來計算所有數字的總和,因爲有一個公式,像這樣:

1 + 2 + ... +數=(數量*(數+ 1))/ 2

接下來,讓我們來看看除數:

var divisors = function(number){ 
sqrtNumber = Math.sqrt(number); 
var sum = 1; 
for(var i = 2; i<= sqrtNumber; i++) 
{ 
    if (number == sqrtNumber * sqrtNumber) 
    { 
     sum += sqrtNumber; 
     sqrtNumber--; 
    } 
    if(number % i == 0) 
    { 
     sum += i + (number/i); 
    }  
} 

    if (sum > number) {return true;} 
    else {return false;} 
}; 

您初始化總和爲1,因爲它是一個除數。但是,我不太明白爲什麼要迭代到平方根而不是數字的一半。例如,如果您將函數調用爲100,那麼您正在迭代,直到i達到10爲止。但是,例如,100可以被20整除。除此之外,你的功能不是最優的。只要你發現number很豐富,你就應該return true。此外,divisors的名稱具有誤導性,您應該用更重要的名稱命名function,如isAbundant。最後,我不明白爲什麼你減少平方根,如果number恰好是它的確切平方,並且如果你這樣做,爲什麼你在循環中有這個檢查。執行:

var isAbundant = function(number) { 
    var sum = 1; 
    var half = number/2; 
    for (var i = 2; i <= half; i++) { 
     if (number % i === 0) { 
      sum += i; 
      if (sum > number) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

注意,完美的數字是不被認爲是由功能豐富。

您不需要存儲所有數字,因爲您正在計算彙總數據。相反,像這樣做:

//we assume that number has been initialized 
console.log("Sum of all numbers: " + ((number * (number + 1))/2)); 
var abundantSum = 0; 
var nonAbundantSum = 0; 
for (var i = 0; i <= number) { 
    if (isAbundant(i)) { 
     abundantSum += i; 
    } else { 
     nonAbundantSum += i; 
    } 
} 
console.log("Sum of non abundant numbers: " + nonAbundantSum); 
console.log("Sum of abundant numbers: " + abundantSum); 

代碼沒有進行測試。另外,請注意溢出問題並組織代碼。

+0

非常感謝您的回答。你的isAbundant函數解決了我的問題:) – zecik123

+0

@ zecik123,如果我的答案解決了你的問題,那麼你可以考慮接受它:) –