2016-04-06 153 views
2

條件:項目歐拉#21

設d(n)的被定義爲n的適當的除數的總和(數字小於n其中均勻地劃分成n)。如果d(a)= b且d(b)= a,其中a≠b,則a和b是友好的對,並且a和b中的每一個被稱爲友好的數字。

例如,220的適當除數是1,2,4,5,10,11,20,22,44,55和110;因此d(220)= 284. 284的適當除數是1,2,4,71和142;所以d(284)= 220

評估下10000

所有的親情號碼的總和我做了以下內容:

static void Main() 
    { 
     long sum = 0; 
     List<int> passedValues = new List<int>(); 
     for (int i = 1; i < 10000; i++) 
     { 
      var number1 = SumOfNumber(i); 
      var number2 = SumOfNumber(SumOfNumber(i)); 
      if (number2 == i && !passedValues.Contains(number1)) 
      { 
       sum = sum + number1; 
       passedValues.Add(number1); 
       passedValues.Add(number2); 
      } 
     } 
     Console.WriteLine(sum); 
     Console.ReadKey(); 
    } 

    private static int SumOfNumber(int input) 
    { 
     int sum = 0; 
     for (int i = 1; i <= input/2; i++) 
     { 
      if (input%i == 0) 
      { 
       sum += i; 
      } 
     } 
     return sum; 
    } 

但是它給造成40284,而正確答案似乎是31626爲什麼我的程序無法正常工作?我是否多次添加東西?我也嘗試添加列表存儲傳遞的值,但它最終給結果25008:

static void Main() 
    { 
     long sum = 0; 
     List<int> passed = new List<int>(); 
     for (int i = 1; i < 10000; i++) 
     { 
      var number1 = SumOfNumber(i); 
      var number2 = SumOfNumber(SumOfNumber(i)); 
      if (number2 == i && !passed.Contains(i)) 
      { 
       sum = sum + number1; 
       passed.Add(number1); 
      } 
     } 
     Console.WriteLine(sum); 
     Console.ReadKey(); 
    } 
+0

http://www.mathblog.dk/project-euler-21-sum-of-amicable-pairs/ –

+3

如果我想複製粘貼一些代碼,我不打算在這裏發佈求助 – KOPEUE

+0

好吧, ,你的代碼只是沒有解決問題。通過它,你會發現爲什麼。你應該找到少於10個f10按鍵的罪魁禍首。 – SimpleVar

回答

2

有兩個問題在這裏:

  1. 您不添加友好的對數總和。
  2. 您正在包含完美數字(其中d(n)= n),因爲a≠b被違反,所以它們不符合友好對。

我覺得你比較接近,當你沒有在列表中添加存儲通過數字,因爲上面造成問題#1,因爲你只是添加的number1的總和的貢獻,但同時添加number1number2列表中,導致number2最終被跳過。要解決問題#2,您還需要驗證number1 != number2。例如:

if (number2 == i && number1 != number2) 
       ^^^^^^^^^^^^^^^^^^^^^ add this check 
{ 
    sum = sum + i; 

同時應用這些修補程序到您提供的代碼後,我得到的31626.

+0

我完全刪除了「passedValues」,因爲它是不必要的。你只看到每個值一次,所以不應該有任何重複。但是,您確實想要添加'i'或'number2',而不是'number1'。考慮一個<10000和b> 10000的情況。你會在總數中加上'b',但它不符合你添加友好數字<10000的條件。幸運的是,沒有友好的對具有<10000和1> 10000的數字,所以這不是問題。 – mellamokb

2

預計總我得到的結果爲31626.的區別就在這裏是如何防止重複在總和。而不是保存到列表中,只是爲了確保我總是少於number1。

static void Main() 
    { 

     long sum = 0; 
     List<int> passedValues = new List<int>(); 
     for (int i = 1; i < 10000; i++) 
     { 
      var number1 = SumOfNumber(i); 
      var number2 = SumOfNumber(SumOfNumber(i)); 


      if (number2 == i && i < number1) 
      { 
       sum = sum + i + number1; 

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

    private static int SumOfNumber(int input) 
    { 
     int sum = 0; 
     for (int i = 1; i <= input/2; i++) 
     { 
      if (input % i == 0) 
      { 
       sum += i; 
      } 
     } 
     return sum; 
    } 
+0

這也是一個很好的解決方案,避免完美的數字和重複很好!乾杯:) – mellamokb

0
private static int SumOfNumber(int input) 
{ 
    int sum = 0; 
    for (int i = 1; i <= input/2; i++) 
    { 
     if (input%i == 0) 
     { 
      sum += i; 
     } 
    } 
    return sum; 
} 

這是不正確的。你只是增加了一個因素,而不是循環到數字的sqrt。