2016-04-14 2 views
-2

Проект Эйлера challenge 23 состояния это:Проект Эйлера # 23 в C#

Совершенное число является числом, для которого сумма его делителей в точности равно числу. Например, сумма правильных делителей 28 будет равна 1 + 2 + 4 + 7 + 14 = 28, что означает, что 28 - идеальное число.

Число 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