-
Notifications
You must be signed in to change notification settings - Fork 0
/
problem-012.py
80 lines (63 loc) · 1.81 KB
/
problem-012.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
69
70
71
72
73
74
75
76
77
78
79
80
"""
Problem 12 - Highly Divisible Triangular Number
The sequence of triangle numbers is generated by adding the natural numbers.
So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.
The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
Let us list the factors of the first seven triangle numbers:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
We can see that 28 is the first triangle number to have over five divisors.
What is the value of the first triangle number to have over five hundred
divisors?
"""
def triangle_number(n: int) -> int:
"""
Parameters
n (int): which triangle number to calculate
Returns
triangle_number (int): nth triangle number
"""
triangle_number = sum([i for i in range(1, n + 1)])
return triangle_number
def num_of_divisors(n: int) -> int:
"""
Parameters
n (int): number to find divisors for
Returns
divisors (int): number of divisors
"""
divisors = 0
perfect_square = False
for i in range(1, round(n ** 0.5) + 1):
if i ** 2 == n:
perfect_square = True
if n % i == 0:
divisors += 1
if perfect_square:
return 2 * divisors - 1
else:
return 2 * divisors
def triangle_n_divisors(n: int) -> int:
"""
Parameters
n (int): number of divisors needed
Returns
triangle_number_n: first triangle number with n divisors
"""
counter = 1
while True:
triangle_number_n = triangle_number(counter)
if num_of_divisors(triangle_number_n) > 500:
break
counter += 1
return triangle_number_n
if __name__ == "__main__":
print(
"The first triangle number with over 500 divisors is: "
+ str(triangle_n_divisors(500))
)