如何循环一个数,使这个数遍历所有可能的值?

2024-09-29 21:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做Euler项目的第9题时遇到了一个问题。我的程序正在走向长期运行。半个多小时。这是我的密码。在

def Problem9():
    a = 1
    b = 1
    c = 1
    x = []
    while(a + b + c != 1000):
        a = a + 1
        for i in range(0,1000):
            c = 1000 - (a + b)
            if a < b < c:
                if (a*a) + (b*b) == (c*c):
                    x.append(a*b*c)
                    print(a*b*c)
            b = b + 1
    print(x)

Problem9()

这基本上是为了找出所有的毕达哥拉斯三胞胎加起来是一千(链接到问题以便你能更好地理解它:https://projecteuler.net/problem=9)我的代码中有问题我可以修复还是我的代码根本上是错的?在


Tags: 项目代码in程序密码forifdef
3条回答

A Pythagorean triplet is a set of three natural numbers, a < b < c, for > which a2 + b2 = c2. There exists exactly one Pythagorean triplet for which a + b + c = 1000.

这会有用的

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())

这个 算法绝对不适用于周长s>;1000000。 有一种更快的算法可以用来解决这个问题。您可以搜索parametrisation of Pythagorean triplets

由于您知道这三个数字必须相加为1000,并且a < b < c,因此您可以利用这一事实来更有效地(并且干净地)循环。在

def Problem9():
    for a in range(1000):
        for b in range(a,1000):
            if a**2 + b**2 == (1000 - a - b)**2:
                return a*b*(1000 - a - b)

在这里,您将a从1循环到1000。因为b必须大于a,所以从a循环到1000。然后,既然你知道了1000 = a + b + c,那么{},你就可以在没有任何循环的情况下测试你的毕达哥拉斯条件。在

你掌握了系统

(*1) a + b + c = 1000
(*2) a² + b² = c²

如果

^{pr2}$

那么

a + b = 1000 - c
(a + b)² = (1000 - c)²
a² + 2ab + b² = 1000² - 2000c + c²
( a² + b² ) + 2ab = 1000² - 2000c + c²

但是,通过(*2),(a²+b²)=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)

另外,abc是整数,a<b<c; 如果a>332a必须至少是333,然后, b应至少为334,然后,c应至少为335333 + 334 + 335 = 1002。在

有了更多的数学知识,你可以做得更容易。在


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()

结果:

time python Special_Pythagorean_triplet.py

(200, 375, 425) 31875000

real0m0.041suser0m0.036ssys0m0.000s

if语句中:

if ( 1000*a + 1000*b + 500000 - a*b == 1000000 )

您可以使用:

if ( a + b + 500 - (a*b)/1000 == 1000 )

但是,在这种情况下,只有整数才重要: 对于第一种方法,您可以绕过除法及其舍入问题。在

相关问题 更多 >

    热门问题