在Python中实现塔比特亲和数定理(Project Euler #21):PQR计算函数结果异常求助
问题排查与修复
嗨,这个问题很典型——你把Python里的幂运算符号搞错啦!
核心错误:误用^符号
在Python中,^不是幂运算(求次方),而是按位异或运算符。而真正的幂运算应该用**(双星号),或者pow()函数。
另外还要注意运算符优先级:*的优先级比^高,所以你原来的代码会先计算乘法,再做异或,完全偏离了公式的本意。
错误计算拆解(以n=2为例)
我们来看看你原来的代码为什么会得到[6,3,16]:
p = (3 * 2^(n - 1) - 1)→ 实际执行的是(3*2) ^ (2-1) -1→6^1 -1→ 7-1=6q = (3 * 2^n) - 1→ 实际执行的是(3*2)^2 -1→6^2 -1→4-1=3r = (9 * 2^((2*n) - 1) - 1)→ 实际执行的是(9*2)^3 -1→18^3 -1→17-1=16
修复后的代码
把所有的^换成**,同时为了可读性,给幂运算部分加上括号(虽然**优先级比*高,不加括号也能正确计算,但加括号更清晰):
def getPQR(n): pqr = [] p = 3 * (2 ** (n - 1)) - 1 pqr.append(p) q = 3 * (2 ** n) - 1 pqr.append(q) r = 9 * (2 ** ((2 * n) - 1)) - 1 pqr.append(r) return pqr
验证结果
当n=2时,调用getPQR(2)会返回[5, 11, 71],完全符合你的预期!
内容的提问来源于stack exchange,提问作者LarleeVee
相关产品推荐
相关产品推荐

