【发布时间】:2018-06-09 19:04:11
【问题描述】:
我正在尝试根据列表中的数字是否为平方数来返回 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...]
正如您所见,在处理许多数字时这将花费很长时间,这就是我需要更快方法的原因。
【问题讨论】:
-
"将平方数预先准备到单独的列表中" 不要那样做。如果您想要一个用于高效成员资格测试的容器,请使用
set,它具有恒定时间成员资格检查,而list具有线性时间成员资格测试。 -
既然 OP 已经做出了一些澄清,这个问题 不是另一个问题的重复。它的三个答案使用浮点运算,这不足以解决这个问题,因为整数可能太大而无法放入浮点变量中。避免这种情况的一个答案是使用一种非常慢的算法来找到平方根的整数部分。我们应该重新打开这个问题,或者出于其他原因关闭它。
-
@TrojanHorse,还需要一个例子……
-
@jpp 举了一个例子
-
编写一个函数来计算整数平方根。可以使用牛顿法(小心)。一个简单的二分搜索甚至更容易实现,并且性能不错,即使对于大数字也是如此。
标签: python list function math numbers