【发布时间】:2016-02-16 07:37:30
【问题描述】:
数字真的很长,(例如 n=341235129628026803631240389584456),我试过这样:if n**(1/2)-floor(n**(1/2)) == 0: true 但程序计数 n**(1/2) 像 1.8472550707144556e+16,但我需要没有 e 的数字
【问题讨论】:
标签: python-3.x bignum
数字真的很长,(例如 n=341235129628026803631240389584456),我试过这样:if n**(1/2)-floor(n**(1/2)) == 0: true 但程序计数 n**(1/2) 像 1.8472550707144556e+16,但我需要没有 e 的数字
【问题讨论】:
标签: python-3.x bignum
你可以用binary search来做到这一点。
对于 x = 1, 2, ..., k, ...(即自然数),函数 f(x) = x2 单调递增。因此,方程 f(m) = m2 = n 至多有一个根(相对于 m),您可以通过二分搜索找到它。
它将需要 O(log3(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
这里我们维护一个不变量:L2 ≤ n 2。 L和R之间的距离减小,直到R = L + 1。然后我们只需要检查L2是否严格等于n(否则,根据我们的不变量,它更小)。
【讨论】: