数字很长,(例如n = 341235129628026803631240389584456),我试过这样的方式:if n**(1/2)-floor(n**(1/2)) == 0: true
但程序计数n **(1/2)如1.8472550707144556e + 16,但我需要数字而不是e < / p>
答案 0 :(得分:1)
您可以使用binary search执行此操作
对于x = 1,2,...,k,...(即自然数),函数f(x)= x 2 是单调递增的。因此,方程f(m)= m 2 = n最多有一个根(相对于m),你可以通过二分搜索找到它。
它将需要O(log 3 (n))操作(因为有BS的O(log(n))迭代,每个都需要平方,这可以在O中完成(log 2 (N)))。
实施可能如下所示:
def find_if_square(n):
L, R = 0, n + 1
while R - L > 1:
M = (R + L) // 2
if M * M <= n:
L = M
else:
R = M
return L * L == n
这里我们保持一个不变量:L 2 ≤n&lt; [R 2 。 L和R之间的距离减小,直到R = L + 1.然后我们只需要检查L 2 是否严格等于n(否则,根据我们的不变量,它更小)。