I was trying to solve problem number 12 of Project Euler. This is the problem:
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?
I defined two functions to do the job:
1) allfactor(x)
: This gives us all the factors of a given number in a list form. Example: allfactor(10)
gives us [1, 2, 5, 10]
2)TriangularNo(x)
: This gives us the nth Triangular number. Example TriangularNo(5)
gives us 5
Here is the complete code which I wrote:
facs=[]
def allfacof(x):
for i in range(1,int(x/2)+1):
if x%i==0:
facs.append(i)
else:
pass
facs.append(x)
return(facs)
def TriangularNo(x):
no=0
for i in range(1,x+1):
no=no+i
return(no)
a=0 # a will tell us the number of iterations
while True:
a+=1
N=TriangularNo(a)
length=(len(allfacof(N)))
if int(length)>=500:
print(N)
break
else:
pass
When I run this code I get 1378
as the output which is clearly wrong because len(allfacof(1378))
turns out to be 8
and not 500
as demanded in the question.
Notice in the while
loop, I use if int(length)>=500:
So this means that when my code runs, length
somehow gets the value = 500 but when I run the function separately it says that it's length is 8.
I am just not able to find out the error. Please help me
The problem is you are using facs
as a global variable and you are only appending to the item. You should make it a member of allfacof() so that it clears out after each value.
If you look into facs
then you will find it equals
1, 1, 3, 1, 2, 3, 6, 1, 2, 5, 10 ...