2016-04-03 297 views
0

当我遇到问题时,我正在做欧拉工程中的问题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)有没有在我的代码有问题,我可以修复或是我的代码根本错误?

+0

循环结构看起来非常不自然且令人费解。你应该有两个普通的嵌套'for'循环,并从另外两个设置第三个变量。优化退出条件以避免不必要的循环。 –

回答

5

既然您知道这三个数字必须加起来为1000a < 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到1,000。因为b必须大于a,所以你从a变到b从a到1000。然后,既然你知道1000 = a + b + c,然后c = 1000 - a - b,你可以测试你没有任何循环的毕达哥拉斯条件。

+1

如果'b> a',第二个循环必须从'a + 1'开始。 – alexis

+0

你的代码结果是什么? –

2

甲勾股数是一个,对于>其中A2 + B2 = C2组三个自然数,一个< b <的C。 存在着正好一个勾股数为其中+ 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> 1 000 000 有一个可以用来解决它的更快的算法。您可以搜索parametrisation of Pythagorean triplets

0

这段代码真的很尴尬。虽然条件本身它有点不对,你会停下前3个数字总和1000,然后退出。另一个错误的是B不重置。你可以做类似Ibukun的建议,但这不是直接做法的最佳方法。你并不需要检查,如果他们总结1000,这更简单:

  1. 迭代一个3至997
  2. 迭代B,从A + 1到999-A
  3. 待办事项C = 1000 - 一个 - B(这就是你不需要检查总和的方法,你已经这样做了)
  4. 检查它们是否三联,当它们结束时,你就完成了!

有你可以看看,一旦你输入了正确的答案其他伟大的方式,他们的方式更有趣

1

一个更好的办法是使用itertools

https://docs.python.org/3.4/library/itertools.html

from itertools import product 
def ff1(): 
    for r in product(range(1,1000),repeat=3): 
     a,b,c=r 
     if a+b+c==1000: 
      if a<b<c: 
       if a**2+b**2==c**2: 
        print(a,b,c) 
        print(a*b*c) 

ff1() 
2

你已经系统

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

如果

a + b + c = 1000 

然后

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) 

此外,一个b,和Ç是整数,和a<b<c; 如果a>332一个必须是,至少,,然后, b应该是,至少,,然后,Ç应该是,至少,; 333 + 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() 

结果:

时间蟒蛇Special_Pythagorean_triplet.py

(200, 375, 425) 31875000

真正0m0.041s用户0m0.036ssys0m0。千

如果声明:

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

你可以使用:

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

,但在这种情况下,只有整数事项: 与第一,你解决部门和四舍五入的问题。

+0

8个空格缩进?为什么? – Signal

相关问题