2016-04-06 158 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。