python中的三角形数
我正在努力解决这个问题: 第一个有500个以上除数的三角形数的值是多少 三角形数是一个数和的序列,即1+2+3+4+5 我很确定这是一个有效的代码,但我不知道,因为我的电脑计算时间太长了。有人知道如何使程序更快一点吗。python中的三角形数,python,Python,我正在努力解决这个问题: 第一个有500个以上除数的三角形数的值是多少 三角形数是一个数和的序列,即1+2+3+4+5 我很确定这是一个有效的代码,但我不知道,因为我的电脑计算时间太长了。有人知道如何使程序更快一点吗。 谢谢 您没有更新one的值,因此您的程序将永远不会结束。提示: 第n个三角形数的公式是什么 n和n+1没有共同因素(除了1)。问题:给定n和n+1中的因子数量,如何计算n*(n+1)中的因子数量?那么n/2和(n+1)(或者n和(n+1)/2)呢 如果您知道n的所有素数因子,如
谢谢
您没有更新
one
的值,因此您的程序将永远不会结束。提示:
- 第n个三角形数的公式是什么
和n
没有共同因素(除了n+1
)。问题:给定1
和n
中的因子数量,如何计算n+1
中的因子数量?那么n*(n+1)
和n/2
(或者(n+1)
和n
)呢(n+1)/2
- 如果您知道
的所有素数因子,如何计算n
的除数n
- 将
替换为l.append
factor_count+=1
- 枚举到
而不是int(a**.5)
(在这种情况下使用a/2
)李>因子计数+=2
- 你必须多想,少用暴力来解决欧拉计划的问题
在这种情况下,您应该调查三角形数有哪些除数以及有多少除数。从头开始,寻找模式,试着理解问题。为了理智起见,你应该使用while True:
并且去掉
您当前的暴力算法效率太低,无法在1分钟的项目时间限制内解决此问题。相反,我建议看看除数函数:one
首先,那些告诉你用暴力无法在一分钟内解决这个问题的人是错误的。针对这种规模问题的蛮力算法将在几秒钟内运行 其次,您发布的代码有几个问题,其中一些已经提到- 一旦达到目标条件(当前打印一个),应通过将
设置为one
以外的值来终止循环0
- 您永远不会重新初始化列表(
)。每次在进入for循环之前重新计算l=[]
和a
,都应该执行此操作b
- 这个问题要求第一个三角形数的除数必须大于500。如果len(l)>500,您的终止条件应为
:
- 您可能不想在for循环中打印一个,而是等待while循环完成
,你要检查a/2以内的每个值,看它是否是除数。您只需检查a
的平方根以下的值。这样,对于a
的每个值,如果x
是一个除数,您可以将x
和x
添加到列表中 以下是我在上面概述的修改后的代码:a/x
import math def main(): l = [] one = 0 a = 1 b = 2 while one == 0: a = a + b b += 1 l = [] sqrt_a = int(math.sqrt(a)) for x in range(1, sqrt_a + 1): if a % x == 0: l.append(x) if x < math.sqrt(a): l.append(a // x) if len(l) > 500: # print(a) one = 1 print(a, b, len(l)) if __name__ == '__main__': main()
导入数学 def main(): l=[] 一=0 a=1 b=2 当一=0时: a=a+b b+=1 l=[] sqrt_a=int(math.sqrt(a)) 对于范围内的x(1,sqrt_a+1): 如果%x==0: l、 附加(x) 如果x
500: #印刷品(a) 一=1 印刷品(a、b、len(l)) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main()
您将看到它在大约5或6秒钟内运行,经过这些修改后不到一分钟。请不要发布“one==0”计算结果为true的代码。看着它很痛苦:|习惯它:-)这是一个和其他任何东西一样好的比较。在这个程序中,它总是正确的…@Renze de Waal:你不能说
或者至少而1
?变量不能被称为而1==1
或其他什么吗?好的,但是为了你自己的理智,请尝试使用一致的缩进:)while True:似乎是正确的做法(我不是Python专家,但我的Python接受它)。我想这是@mark lincoln的成语,意思是running
。考虑到问题while True
在这里是合适的。他只需要在,而True
之后添加一个打印
,修复几个bug,解决方案就会起作用(尽管速度太慢)。我同意-打印后返回会起作用,至少在这一部分。我个人试图远离真实的东西,因为我有一个讨厌的习惯,忘记归还东西:PYou给出了太多的解决方案。但他给出了很好的方向!(与上面的Ghose近乎暴力的解决方案不同)。+1:非常非常有用的提示。特别是除数的素因子——天才。中断
import math def main(): l = [] one = 0 a = 1 b = 2 while one == 0: a = a + b b += 1 l = [] sqrt_a = int(math.sqrt(a)) for x in range(1, sqrt_a + 1): if a % x == 0: l.append(x) if x < math.sqrt(a): l.append(a // x) if len(l) > 500: # print(a) one = 1 print(a, b, len(l)) if __name__ == '__main__': main()
- 一旦达到目标条件(当前打印一个),应通过将