Solution to problem 12

This commit is contained in:
David Doblas Jiménez 2021-07-09 21:01:36 +02:00
parent 5b6901aafa
commit 394628d98d

67
src/Python/Problem012.py Normal file
View File

@ -0,0 +1,67 @@
#!/usr/bin/env python3
"""
Created on 01 Jan 2018
@author: David Doblas Jiménez
@email: daviddoji@pm.me
Solution for problem 12 of Project Euler
https://projecteuler.net/problem=12
"""
import itertools
from utils import timeit
from math import sqrt, floor
# Returns the number of integers in the range [1, n] that divide n.
def num_divisors(n):
end = floor(sqrt(n))
divs = []
for i in range(1, end + 1):
if n % i == 0:
divs.append(i)
if end**2 == n:
divs.pop()
return 2*len(divs)
@timeit("Problem 12")
def compute():
"""
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?
"""
triangle = 0
for i in itertools.count(1):
# This is the ith triangle number, i.e. num = 1 + 2 + ... + i =
# = i*(i+1)/2
triangle += i
if num_divisors(triangle) > 500:
return str(triangle)
if __name__ == "__main__":
print(f"Result for Problem 12: {compute()}")