如何去除毕达哥拉斯三元组输出中的重复组合?
解决毕达哥拉斯三元组重复问题
你的代码里添加a!=b只能排除a和b相等的情况,但没限制两者的顺序,所以会出现(3,4,5)和(4,3,5)这类顺序颠倒的重复组合。要解决这个问题,核心是固定a和b的大小关系,让a始终小于b,这样就不会生成重复的颠倒组合。
修改方案1:调整循环范围(基础优化)
把b的起始值设为a+1,保证b始终大于a;同时c的起始值设为b+1(因为c必须大于b,毕竟a²是正数,c²=a²+b² > b²),减少不必要的循环:
def triad(N): for a in range(1, N): # b从a+1开始,确保a < b for b in range(a + 1, N): # c从b+1开始,确保b < c for c in range(b + 1, N): if a*a + b*b == c*c: print(a, b, c) print('-'*10) triad(20)
这样修改后,只会输出a < b < c的三元组,自然不会出现顺序颠倒的重复项,同时冗余的a!=b判断也可以直接去掉。
修改方案2:通过计算替代c的遍历(高效优化)
如果N较大,遍历c会浪费很多资源,我们可以直接计算c的平方根,判断其是否为整数且在范围内:
def triad(N): for a in range(1, N): for b in range(a + 1, N): c_squared = a*a + b*b c = int(c_squared**0.5) # 双重验证:c不超过N,且平方等于原数(避免浮点数精度误差) if c < N and c*c == c_squared: print(a, b, c) print('-'*10) triad(20)
这个版本不需要遍历c,直接通过数学计算得到c,效率会高很多。
内容的提问来源于stack exchange,提问作者wcumactvofiaiexsdu
相关产品推荐
相关产品推荐

