2024-05-07 23:31:10 发布
网友
我一直在研究一个问题,以确定给定的整数n是否是一个完美平方。虽然算法可行,但我得到了一个MemoryError。我应该如何重新表述这个代码位?你知道吗
n
MemoryError
提前谢谢。你知道吗
def is_square(n): for i in range(1, (n/2)): i += 1 if n % i == 0 and n // i == i: return True return False
有几件事:
这似乎是Python2代码(因为range(1, n/2)会在Python3中为所有奇数n抛出一个TypeError)。你应该使用xrange而不是Eric Appelt在评论中建议的range。range在Python2中创建一个列表,而实际上您只需要一个生成器。
range(1, n/2)
TypeError
xrange
range
您可以通过检查i * i == n(或i**2 == n)来减少正在执行的操作数。然后你做一个乘法(或指数)和一个等式检查,而不是一个mod,一个floordiv和两个等式检查。
i * i == n
i**2 == n
如果你要走那么远,为什么不直接做def is_square(n): root = n**0.5; return int(root) == root?你会发现很多“改进你的算法”是利用数学而不是暴力。
def is_square(n): root = n**0.5; return int(root) == root
不相关的,没有理由在for循环内执行i += 1。这就是for循环的作用。你知道吗
for
i += 1
有几件事:
这似乎是Python2代码(因为
range(1, n/2)
会在Python3中为所有奇数n
抛出一个TypeError
)。你应该使用xrange
而不是Eric Appelt在评论中建议的range
。range
在Python2中创建一个列表,而实际上您只需要一个生成器。您可以通过检查
i * i == n
(或i**2 == n
)来减少正在执行的操作数。然后你做一个乘法(或指数)和一个等式检查,而不是一个mod,一个floordiv和两个等式检查。如果你要走那么远,为什么不直接做
def is_square(n): root = n**0.5; return int(root) == root
?你会发现很多“改进你的算法”是利用数学而不是暴力。不相关的,没有理由在
for
循环内执行i += 1
。这就是for
循环的作用。你知道吗相关问题 更多 >
编程相关推荐