level 3
您的代码主要有以下几个核心问题:
变量命名覆盖内置函数 (非常危险)
您使用了 list = []。list 是 Python 中用于创建列表的关键字(内置函数)。将它用作变量名会覆盖掉原来的功能,导致后续如果想用 list() 函数时程序会出错。这是一个非常不好的编程习惯。应避免使用 list, dict, str, int 等作为变量名。
逻辑错误:list.count(i**2*2) == 0
这一行代码的逻辑非常令人困惑,并且是完全错误的。
list.append(i**2*2) 和 list.count(...) 似乎是想做一个“去重”操作,但去重的对象和方式都是不
正确的
。
题目要求的是计算所有满足条件的三元组的数量,例如 (3, 4, 5) 和 (5, 12, 13) 是两个不同的解,都需要计数。您这个去重操作可能会错误地排除掉一些有效的解。例如,如果 n=13,当找到 (5, 12, 13) 后,您可能会把 c=13 的某些情况给排除了,导致后续找不到其他 c=13 的解(虽然本例中没有)。
这个去重逻辑应该完全删除。
遗漏了关键条件 a ≤ b
您的代码通过 a = sqrt(i*i - j*j) 计算出了 a。此时,您有了 a, b=j, c=i。
题目要求 a ≤ b。您的循环 for j in range(1, i) 只保证了 b < c,但完全没有保证 a ≤ b。
例如,当 n=5, i=5 (c=5), j=4 (b=4) 时,您计算出 a = sqrt(25 - 16) = 3。因为 a=3 <= b=4,这是一个有效的解 (3, 4, 5)。
但是,当 i=5 (c=5), j=3 (b=3) 时,您计算出 a = sqrt(25 - 9) = 4。此时 a=4 > b=3,不满足 a ≤ b 的条件,所以 (4, 3, 5) 是一个无效的解,不应该被计数。您的代码没有排除这种情况,导致了重复计数。
如何修正您的代码修正的核心是去掉错误的去重逻辑,并加上 a <= b 的判断。Pythonimport mathdef solve(): try: n = int(input()) except (ValueError, EOFError): return ans = 0 # 循环 c for c in range(1, n + 1): # 循环 b, b 必须小于 c for b in range(1, c): # 根据 a*a + b*b = c*c 计算 a*a a_squared = c*c - b*b # a 必须是正整数,所以 a_squared 必须是正数 if a_squared <= 0: continue a = math.sqrt(a_squared)
# 检查 a 是否为整数 if a == int(a): #
检查是否满足 1 <= a <= b if a <= b: ans += 1 print(ans)solve()这个修正后的代码逻辑是正确的,但效率和我上一条回复中给出的 O(n²) 解法相比要低一些,不过对于 n=1000 的情况也足够通过了。总结: 您的主要错误在于错误地设计了去重逻辑,并且遗漏了 a <= b 这个关键的约束条件,导致对同一个勾股数组(如 (3,4,5) 和 (4,3,5))进行了重复计数。
2026年02月02日 11点02分

