Python 如何循环一个数字,使该数字遍历每个可能的值?
我在做Euler项目的第9题时遇到了一个问题。我的计划已经走上了太长的路。半个多小时。这是我的密码Python 如何循环一个数字,使该数字遍历每个可能的值?,python,arrays,loops,Python,Arrays,Loops,我在做Euler项目的第9题时遇到了一个问题。我的计划已经走上了太长的路。半个多小时。这是我的密码 def Problem9(): a=1 b=1 c=1 x=[] 而(a+b+c!=1000): a=a+1 对于范围(01000)内的i: c=1000-(a+b) 如果a
def Problem9():
a=1
b=1
c=1
x=[]
而(a+b+c!=1000):
a=a+1
对于范围(01000)内的i:
c=1000-(a+b)
如果a
这基本上是为了找出所有的毕达哥拉斯三胞胎,加起来有一千个(链接到问题,以便您更好地理解它:)我的代码中是否有我可以修复的问题,或者我的代码根本上是错误的
毕达哥拉斯三元组是一组三个自然数,A
这会奏效的
def pythagorean_tiplet():
a = 1
while(a < 1000):
b = a + 1 # note this, b is starting from a + 1, since b starting from 0 is useless and will only add to the running time.
while (b < 1000):
result = a**2 + b**2
c = math.sqrt(result)
if (( a + b + c) == 1000 and (a < b < c)): #test for conditions
return a * b * c
b += 1
a += 1
print(pythagorean_tiplet())
def pythagorean_tiplet():
a=1
而(a<1000):
b=a+1#注意,b是从a+1开始的,因为b从0开始是无用的,只会增加运行时间。
而(b<1000):
结果=a**2+b**2
c=数学sqrt(结果)
如果((a+b+c)=1000和(a
这个
算法绝对不适用于周长s>1 000 000的情况。
有一种更快的算法可以用来解决这个问题。你可以搜索毕达哥拉斯三胞胎的参数化,因为你知道这三个数字加起来必须是1000,而a,你可以利用这一事实更有效地(干净地)循环
在这里,您可以将
a
从1循环到1000。因为b必须大于a,所以从a到1000,在b上循环。然后,既然您知道1000=a+b+c
,那么c=1000-a-b
,您就可以测试毕达哥拉斯条件,而无需任何循环 这段代码真的很笨拙。虽然条件本身是错误的,但你可以用前3个和1000的数字停止,然后退出。另一个错误是B不能复位。您可以按照Ibukun的建议进行类似的操作,但这并不是实现这种直接方法的最佳方式。你不需要检查他们的总数是否为1000。简单得多:
输入正确答案后,您还可以查看其他一些很棒的方法,它们更有趣更好的方法是使用itertools 来自itertools导入产品的
def ff1():
对于产品中的r(范围(11000),重复=3):
a、 b,c=r
如果a+b+c==1000:
如果a您已经安装了系统
(*1) a + b + c = 1000
(*2) a² + b² = c²
如果
然后
但是,通过(*2),(a²+b²)=c²,然后
c² + 2ab = 1000² - 2000c + c²
2ab = 1000² - 2000c
2000c = 1000² - 2ab
然后
那么,现在,您有了新的系统:
(*3) a + b + 500 - ab/(1000) = 1000
(*4) c = 500 - ab/(1000)
此外,a、b和c都是整数,a循环结构似乎非常不自然和复杂。应该为
循环设置两个普通嵌套的,并设置其他两个变量中的第三个变量。优化退出条件以避免不必要的循环。如果b>a
,则第二个循环必须从a+1
.8空格缩进开始?为什么?
a + b + c = 1000
a + b = 1000 - c
(a + b)² = (1000 - c)²
a² + 2ab + b² = 1000² - 2000c + c²
( a² + b² ) + 2ab = 1000² - 2000c + c²
c² + 2ab = 1000² - 2000c + c²
2ab = 1000² - 2000c
2000c = 1000² - 2ab
c = 500 - ab/(1000)
(*3) a + b + 500 - ab/(1000) = 1000
(*4) c = 500 - ab/(1000)
def p():
for a in range(1,333):
for b in range(a+1,(1000-a)/2):
if ( 1000*a + 1000*b + 500000 - a*b == 1000000 ):
c=500-((a*b)/1000)
print (a,b,c);print a*b*c
return
p()
if ( 1000*a + 1000*b + 500000 - a*b == 1000000 )
if ( a + b + 500 - (a*b)/1000 == 1000 )