-
Notifications
You must be signed in to change notification settings - Fork 0
/
problem023.py
68 lines (58 loc) · 2.11 KB
/
problem023.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# A perfect number is a number for which the sum of its proper divisors is
# exactly equal to the number. For example, the sum of the proper divisors
# of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect
# number.
#
# A number n is called deficient if the sum of its proper divisors is less
# than n and it is called abundant if this sum exceeds n.
#
# As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the
# smallest number that can be written as the sum of two abundant numbers
# is 24. By mathematical analysis, it can be shown that all integers
# greater than 28123 can be written as the sum of two abundant numbers.
# However, this upper limit cannot be reduced any further by analysis even
# though it is known that the greatest number that cannot be expressed as
# the sum of two abundant numbers is less than this limit.
#
# Find the sum of all the positive integers which cannot be written as the
# sum of two abundant numbers.
from common_funcs import answer, div_gen
def isAbundant(n):
if sum(list(div_gen(n))[:-1]) > n:
return True
return False
# returns array of abundant numbers between a and b
def abundantGenerator(a,b):
abundants = []
for x in range(a,b):
if isAbundant(x):
abundants.append(x)
return abundants
# tests if n is a sum of two numbers in a list
def sumOfTwo(n, listOfNums):
for x in list:
for y in listOfNums:
if x + y > n:
break
if x + y == n:
return True
return False
# generates all possible sums of two into a new list
def SumOfTwoGenerator(listOfNums):
sumsOfTwo = []
for x in listOfNums:
for y in listOfNums:
sumsOfTwo.append(x+y)
return sorted(list(set(sumsOfTwo)))
def solve():
print("Generating abundants...")
abundants = abundantGenerator(12,28123)
print("Generating possible sums...")
Sums = SumOfTwoGenerator(abundants)
print("Calculating answer...")
total = 0
for x in range(1,28123):
if x not in Sums:
total = total + x
return total
answer(solve)