2016-04-14 48 views
-2

項目歐拉challenge 23美國這樣的:項目歐拉#23在C#

一個完美的編號是針對其適當除數的總和正好等於號。例如,28的適當因數的和將是1 + 2 + 4 + 7 + 14 = 28,這意味着28是一個完美的數字。

如果n的合適除數之和小於n,則n稱爲不足,如果和超過n,則稱n爲大數。

由於12是最小的豐富數字,1 + 2 + 3 + 4 + 6 = 16,可以寫成兩個豐富數字之和的最小數字是24.通過數學分析,可以看出所有大於28123的整數都可以寫成兩個豐富數字的總和。然而,即使知道不能表示爲兩個豐富數的總和的最大數小於該極限,也不能通過分析進一步減少該上限。

查找所有不能寫成兩個豐富數字之和的正整數的和。

所以我一直在試圖得到這個工作,但是我不斷收到回一個不正確的結果,我不知道在哪裏,這是在代碼中去錯了,雖然我有:

static void Main(string[] args) 
    { 
     List<int> abundantNums = Enumerable.Range(12, 1000000).Where(i => isAbundant(i)).ToList(); 
     abundantNums = abundantNums.Distinct().ToList(); 

     var boolArr = new bool[28124];   

     for (int i = 0; i < abundantNums.Count; ++i) 
     { 
      for (int j = i; j < abundantNums.Count; ++j) 
      { 
       var sum = abundantNums[i] + abundantNums[j]; 
       if (sum < 28124) boolArr[sum] = true; 
       else break; 
      } 
     } 


     var total = 0; 
     for (int i = 0; i < boolArr.Length; i++) 
     { 
      if (boolArr[i] == false) 
      { 
       total += i; 
      } 
     } 

     Console.WriteLine(total); 
     Console.ReadKey();   
    } 

    static bool isAbundant(int num) 
    { 
     if (getFactors(num).Sum() > num) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

然後找了好幾個因素,我有:

static List<int> getFactors(int num) 
    { 
     List<int> factors = new List<int>(); 
     Stopwatch watch = Stopwatch.StartNew(); 
     for (int i=1; i < Math.Sqrt(num) + 1; i++) 
     { 
      if (num % i == 0) 
      { 
       factors.Add(i); 
       if (num/i != i) 
       { 
        factors.Add(num/i); 
       } 
      } 
     } 
     watch.Stop(); 
     factors.Remove(num); 
     return factors; 
    } 

現在我已經在這了一兩天,而據我所知這應該做的伎倆,任何人都更聰明,比我能夠指出我的失敗?

+1

請同時陳述問題陳述。 –

+1

你會得到什麼結果,你期望什麼? – BugFinder

+0

4178816是我得到的結果,我不確定我期待什麼,因爲我不知道正確的答案,我只知道它說這是不正確的 – Coombes

回答

1

問題是您的getFactors循環。更改:

for (int i=1; i < Math.Sqrt(num) + 1; i++) 

for (int i=1; i <= Math.Sqrt(num); i++) 

,它應該工作。我會讓你試着明白爲什麼:-)

+0

這改變了輸出,但它仍然說我的新結果也是錯誤的 – Coombes

+0

@Coombes爲我工作:[檢查它](https://dotnetfiddle.net/SjXM19)...你期待什麼結果? '4179871'應該是正確的結果 – Jcl