2014-10-02 1 views
0

Это мое решение проблемы 23 Project Euler, которая составляет:Почему эта программа Sage не работает должным образом (Project Euler 23)?

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

Число n называется дефицитным, если сумма его собственных делителей меньше n, и это называемый обильным, если эта сумма превышает n.

Поскольку 12 - наименьшее обильное число, 1 + 2 + 3 + 4 + 6 = 16, наименьшее число, которое может быть записано в виде суммы двух обильных чисел, равно 24. By математический а nalysis, можно показать, что все целые числа больше 28123 могут быть записаны как сумма двух обильных чисел. Однако этот верхний предел еще не может быть уменьшен путем анализа, хотя известно, что наибольшее число, которое не может быть выражено как сумма двух обильных чисел, меньше этого предела.

Найти сумму всех положительных целых чисел, которые не могут быть записаны в виде суммы двух избыточных чисел.»

Я написал этот код, но по какой-то причине это дает мне 4190404, которая, в соответствии с проектом сайт Эйлера неверен.

import numpy 

def lowfactor(n): 
    factors = [i for i in xrange(2, ceil(sqrt(n))) if n % i == 0] 

    return list(numpy.unique(factors)) 

def factor(n): 
    low = lowfactor(n) 
    factors = [n/i for i in low] 
    factors.reverse() 
    factors = factors + low 

    return factors 

def isAbundant(n): 
    factors = factor(n) 
    factorSum = sum(factors) 

    return factorSum > n 

abundants = [i for i in xrange(28124) if isAbundant(i)] 

sums = map(lambda n: False, range(28124)) 

for a in xrange(0, len(abundants)): 
    for b in xrange(a, len(abundants)): 
     if (abundants[a] + abundants[b]) < 28124: 
      sums[abundants[a] + abundants[b]] = True 

notsums = [] 
for i in xrange(28124): 
    if not sums[i]: 
     notsums.append(i) 

sumofnotsums = sum(notsums) 

print(sumofnotsums) 

ответ

0

вы увидите проблему, если рассчитать коэффициент (28) и сравнить свой результат с ответом дается Эйлера.

+0

Да, я перешел на использование 'делителей()' функция, предоставленная Sage, и программа была исправлена. – Kytuzian

 Смежные вопросы

  • Нет связанных вопросов^_^