-1
import sys

def pythTrue(a,b,c):
    (A,B,C) = (a*a,b*b,c*c)
    if A + B == C or B + C == A or A + C == B:
        return True

def smallestTrip(a,b,c):
    if pythTrue(a,b,c) == True:
        if (a+b+c)%12 == 0:
            return True
        else:
            return False

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if x+y+z<=n:
                    if smallestTrip(x, y, z)==False:
                        list_.append([x,y,z])
    print (list_)

tuplePyth(int(sys.argv[1]))

毕达哥拉斯三元组是满足关系 a 2 + b 2 = c 2的 3 个正整数 a、b、c 的集合。最小和最著名的毕达哥拉斯三元组是 (a, b, c) = (3, 4, 5)。编写一个程序,读取命令行参数 n 并将所有总和小于 n(即 a+b+c < n)且不是 (3, 4, 5) 三元组的倍数的毕达哥拉斯三元组打印到屏幕上. 你的程序将把三元组表示为 3 元组,并且应该包含三个函数:

  • 一个函数,它接受一个元组并返回一个布尔值,指示毕达哥拉斯关系是否成立。
  • 一个函数,它接受一个元组并返回一个布尔值,指示一个三元组是否是最小三元组的倍数。
  • 一个函数,它接受一个整数 n 并生成上面指定的毕达哥拉斯三元组。该函数应该返回一个元组列表。

pythagore.py 程序的主要部分将读取命令行输入,调用上述最后一个函数,并每行打印一个三元组的结果。

我的问题是我以不同的顺序得到相同的组合,例如:(5,12,13)​​,(13,12,5)...等

4

4 回答 4

0

您可以使用迭代工具:

 import itertools.combinations_with_replacement as cwr
 list_ = [triple for triple in cwr(range(n),3) if sum(triple)<n and not smallestTrip(triple)]

您还可以强制数字与限制一致。此外,您可以通过意识到如果我们将 a 定义为最小数,那么它必须小于 n/3(b 和 c 都至少与 a 一样大,所以如果 a大于 n/3,则 a、b 和 c 之和将大于 n)。同样,b 必须小于 n/2。一旦你找到了 a 和 b 的所有组合,你就可以找到所有大于 b 且小于 nab 的 c。

list_=[]
for x in range(1, n//3):
    for y in range(x+1, n//2):
        for z in range (x+y+1, n-x-y):
                if not smallestTrip(x, y, z):
                    list_.append([x,y,z])
于 2018-10-25T21:09:29.750 回答
0

你的主程序缺乏逻辑。没有什么可以强制要求三元组只有一个顺序:你的xy是可互换的,并且你保证你会检查两者。

相反,强制x < y使用您的循环限制,然后确保在y或的值z变得太大而无法使用时停止。请注意,这消除了您对三者总和的检查。

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if x+y+z<=n:
                    if smallestTrip(x, y, z)==False:
                        list_.append([x,y,z])
    print (list_)

反而:

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(x + 1, (n - x) // 2):
            for z in range (y + 1, n - x - y):
                if smallestTrip(x, y, z)==False:
                    list_.append([x,y,z])
    print (list_)

n=100 的输出:

[[5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [15, 36, 39], [16, 30, 34], [20, 21, 29]]

请注意,您仍然有一个问题smallestTrip:您的检查在逻辑上不等同于“最小的三元组”。相反,请检查这三个数字是否互质。由于 Stack Overflow 每次发帖只允许一个问题,而且这个问题很容易在线研究,我将把它作为练习留给学生。:-)

于 2018-10-25T18:24:38.810 回答
0

一个简单的解决方案是跟踪已找到的那些并添加检查以避免重复它们。下面使用 aset来存储已经生成的元素,并对每个三元组中的元素进行排序,以便它们的顺序无关紧要。

def tuplePyth(n):
    list_=[]
    seen = set()
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if tuple(sorted((x,y,z))) not in seen:
                    if x+y+z <= n:
                        if smallestTrip(x, y, z) == False:
                            list_.append([x,y,z])
                    seen.add((x,y,z))
    print (list_)
于 2018-10-25T19:26:59.660 回答
-1

因为这三个数字永远不会相同,所以您可以将第二个和第三个范围从 (1,n) 相应地更改为 (x+1,n) 和 (y+1,n)。

于 2018-10-25T18:27:07.433 回答