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把计算过的记录起来。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)