我试图解决一个问题,找到超过500除数的第一个三角数,但是有溢出错误
请提供更好的方式
问题是
通过添加自然数来生成三角数的序列。所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:
1,3,6,10,15,21,28,36,45,55,66 ......
让我们列出前七个三角形数字的因子: 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 我们可以看到28是第一个有超过五个除数的三角形数。 具有超过500个除数的第一个三角形数的值是多少?
我的节目是
`
def isPrime(a):
m=0
for j in range(1,a/2+1):
if (a%j)==0:
m+=1
return m+1
i=1
n=1
div=500
while (i>=1):
l=isPrime(i)
ans=i
if l>div:
print ans
break
n+=1
i=n*(n+1)/2
`
答案 0 :(得分:1)
这个问题的关键是如何使你的程序更有效率,你必须写一些以更有效的方式计算整数除数的东西。关于如何在这个论坛中进行讨论有很多讨论,例如:What is the best way to get all the divisors of a number? 但是,我仍然认为你的程序存在一些问题,所以我写了一个(仍然用你的方法找到除数的数量):
def numberOfDivisors(a):
m=0
for j in range(1,a/2+1):
if (a%j)==0:
m+=1
return m+1
def findNumber():
n = 1
i = 1
div = numberOfDivisors(n)
while div < 500:
i += 1
n = i*(i+1)/2
div = numberOfDivisors(n)
print 'n = ', n
return n
不必要的打印只是为了更容易遵循代码的工作方式。正如我所说,仍然使用非常差的方法来查找除数的数量。提高效率是解决问题的方法。这个程序无法正常工作,因为它达到6位或7位数字时会太慢。
答案 1 :(得分:0)
找到除数的一个简单但更有效的方法是使用数的素数因子化来生成除数的数量。找到素数分解已有详细记载,但我建议使用“Eratosthenes筛”或类似的东西(link to wiki)
一旦得到素数因子分解,你只需要在here所述的因式分析中找到从0到每个素数幂的排列数。无需真正找到所有因素:)
这就是我刚刚找到解决同样问题的方法,我的程序能够在不到9秒的时间内测试前12,375个三角形数字。
编辑:我应该提一下,如果你想要追求这种方法,你可能需要研究递归函数,因为你需要它来找到素因子分解中找到的所有权力的排列