Python Project Euler 012:500个约数的三角形数

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?

 

三角形数都可以表示成n*(n+1)/2的形式,不过我在做这道题的时候没有意识到(悲催。。)。

我的思路是把每个三角形数看作n*(2n-1)或n*(2n+1)的其中一种(其实和上面的形式是一样的)。因为n和2n-1或2n+1是互质的,所以该三角形数的约数个数等于n的约数个数与2n-1或2n+1的约数个数的乘积。用dict把计算过的记录起来。

 

View Code
 1 factors = {2:1, 3:1}
 2 def factoring1(n):
 3     if factors.get(n, None) != None:
 4         return factors[n]
 5     else:
 6         facCount = 0
 7         for i in range(1, int(n/2)+1):
 8             if n % i == 0:
 9                 facCount += 1
10         factors[n] = facCount
11         return factors[n]
12 
13 def pe012(k):
14     theNumber = 0
15     n = 2
16     while True:
17         m1 = n * (2*n - 1)
18         factors[m1] = (factoring1(n)+1) * (factoring1(2*n-1)+1) - 1
19         if factors[m1] >= k:
20             theNumber = m1
21             break
22         m2 = n * (2*n + 1)
23         factors[m2] = (factoring1(n)+1) * (factoring1(2*n+1)+1) - 1
24         if factors[m2] >= k:
25             theNumber = m2
26             break
27         n += 1
28     return theNumber    
29 
30 if __name__ == '__main__':
31     a1 = pe012(500)
32     print(a1)

 

posted @ 2012-12-07 11:07  river_run  阅读(324)  评论(0编辑  收藏  举报