project euler 12 Highly divisible triangular number


Highly divisible triangular number


Problem 12


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
divisor(num,j): count1 = 1 count2 = 1 if num%2 == 0: lst1 = [num//2] lst2 = [num+1] else: lst1 = [(num+1)//2] lst2 = [num] for i in range(2,lst1[0]): if lst1[0] % i ==0: count1 += 1 # print(i) lst1.append(i) for i in range(2,lst2[0]): if lst2[0] % i ==0: count2 += 1 lst2.append(i) count = count1 + count2 + count1*count2 return count n = 1 import time print(time.time()) while True: j = n*(n+1)//2 if str(j)[-1] != '0': #print(n) n += 1 continue count = divisor(n,j) # print(j,n,count) n += 1 if count >= 500: print(j,n,count) break print(time.time()) 1462342495.953848 76576500 12376 575 1462342499.651143

 

约4S

对求因子的算法进行一点改进,能提高一半效率。

 

    for i in range(2,lst1[0]//2+1):


    for i in range(2,lst2[0]//2+1):


>>> 
1462414510.288464
76576500 12376 575
1462414512.207313

 

再次对求因子进行改进,效率提高10倍!!

    for i in range(2,int(sqrt(lst1[0])+1)):
        if lst1[0] % i ==0:
            count1 += 2
1462415389.778016
76576500 12376 575
1462415389.91842
>>> 

 


 

 

posted on 2016-05-04 14:16  zhourong1104  阅读(211)  评论(0编辑  收藏  举报