如何检查,是另一个数字的数字方块,python3

时间:2016-02-16 07:37:30

标签: python-3.x bignum

数字很长,(例如n = 341235129628026803631240389584456),我试过这样的方式:if n**(1/2)-floor(n**(1/2)) == 0: true但程序计数n **(1/2)如1.8472550707144556e + 16,但我需要数字而不是e < / p>

1 个答案:

答案 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(否则,根据我们的不变量,它更小)。