gpt4 book ai didi

python - 在Python 3中判断一个数字是否是平方数的最快方法是什么

转载 作者:行者123 更新时间:2023-11-30 22:13:26 25 4
gpt4 key购买 nike

我试图根据列表中的数字是否为平方数来返回 True/False 输出。

该列表需要检查多次,并且该列表可以是任何正整数,这意味着该整数可以非常大,事实上,对于使用涉及 math.sqrt() 函数的其他解决方案,这些解决方案会产生溢出错误,如下所示:

userList = [1*10**1000]
print ([x for x in userList if math.sqrt(x).is_integer()])

>>>Traceback (most recent call last):
print ([x for x in userList if math.sqrt(x).is_integer()])
OverflowError: int too large to convert to float

这是我的*方法:

def squares():
for i in userList:
if i in squares: #the list in which all the square numbers are stored
return True
else:
return False

*我当前的想法是将平方数预先准备到一个单独的列表中,以便比较它们,但我可能正在寻找一种替代的、更快方法,因为 userList 可能会变得非常大。

我想将返回的输出存储在单独的列表中,如下所示:

out = []
for i in userList:
out.append(squares())

print(out)
>>>[False,True...]

正如您所看到的,在处理许多数字时,这将花费很长时间,这就是为什么我需要更快的方法的原因。

最佳答案

一个简单的方法是写 integer square root功能。这是基于二分搜索的次优(但仍然相当快)的方法:

def is_sqrt(m,n):
return m**2 <= n < (m+1)**2

def isqrt(n):
low = 0
high = n
m = (low + high)//2

while not is_sqrt(m,n):
if m**2 < n: #too small! must be in [m+1,high]
low = m+1
else: #too big! must be in [low, m-1]
high = m - 1
m = (low + high) // 2
return m

def is_square(n):
return n == (isqrt(n))**2

然后以下几乎是瞬时的:

>>> is_square(77**200)
True
>>> is_square(77**200 + 1)
False

关于python - 在Python 3中判断一个数字是否是平方数的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com