Python 如何循环一个数字,使该数字遍历每个可能的值?

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

我在做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
这基本上是为了找出所有的毕达哥拉斯三胞胎,加起来有一千个(链接到问题,以便您更好地理解它:)我的代码中是否有我可以修复的问题,或者我的代码根本上是错误的

毕达哥拉斯三元组是一组三个自然数,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。简单得多:

  • 从3迭代到997
  • 将B从A+1迭代到999-A
  • Do C=1000-A-B(这就是你不需要检查总和的方式,你已经这样做了)
  • 检查它们是否是三元组,当它们是时,您就完成了
    输入正确答案后,您还可以查看其他一些很棒的方法,它们更有趣

    更好的方法是使用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)
    

    此外,abc都是整数,
    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 )