如何有序遍历i、j值以避免毕达哥拉斯三元组重复?
解决毕达哥拉斯三元组重复输出问题
问题根源
你的代码中i和j均从1到30完整遍历,由于加法交换律i² + j² = j² + i²,导致同一组三元组会以(i,j,k)和(j,i,k)两种形式重复输出。
解决方案:限制j的遍历范围
只需要让j的起始值等于当前的i,保证i ≤ j,就能避免顺序颠倒的重复。修改后的代码如下:
for i in range(1, 31): # 让j从i开始遍历,确保i <= j,消除顺序重复 for j in range(i, 31): for k in range(1, 31): if i**2 + j**2 == k**2: print(i, ",", j, ",", k)
优化版本(减少无效循环)
考虑到k必然大于j(因为i ≥ 1,所以k² = i² + j² > j²,即k > j),可以直接让k从j+1开始遍历,减少不必要的循环次数:
for i in range(1, 31): for j in range(i, 31): # k从j+1开始,避免无效遍历 for k in range(j+1, 31): if i**2 + j**2 == k**2: print(i, ",", j, ",", k)
修改后的输出结果
3 , 4 , 5 5 , 12 , 13 6 , 8 , 10 7 , 24 , 25 8 , 15 , 17 9 , 12 , 15 10 , 24 , 26 12 , 16 , 20 15 , 20 , 25 18 , 24 , 30 20 , 21 , 29
内容的提问来源于stack exchange,提问作者Nishit Barbhaya
相关产品推荐
相关产品推荐

