Python - 检查数字是否为正方形

M. *_*bra 0 python integer boolean input

我写了一个函数,它返回一个数字输入是否为正方形

def is_square(n):
    if n<1:
        return False
    else:
        for i in range(int(n/2)+1):
            if (i*i)==n:
                return True
            else:
                return False
Run Code Online (Sandbox Code Playgroud)

我相信这段代码有效.但是,当我做测试用例时,例如:test.expect( is_square( 4)),它表示该值不是预期的值.

Blu*_*ode 6

你的函数实际上不起作用,因为它会在找到的第一个非平方根上返回False.相反,您需要将代码修改为:

def is_square(n):
    if n<1:
        return False
    else:
        for i in range(int(n/2)+1):
            if (i*i)==n:
                return True
        return False
Run Code Online (Sandbox Code Playgroud)

这样一旦检查了所有可能的平方根,它就只返回false.您可能还想查看math.sqrt()float.is_integer().使用这些方法,您的功能将变为:

from math import sqrt

def is_square(n):
    return sqrt(n).is_integer()
Run Code Online (Sandbox Code Playgroud)

请记住,此方法不适用于非常大的数字,但使用它们的方法会非常慢,因此您必须选择使用哪种方法.希望我帮忙!


Man*_*anu 6

Python哲学的主要思想是编写简单的代码。要检查数字是否为完全平方数:

def is_square(n):
    return n**0.5 == int(n**0.5)
Run Code Online (Sandbox Code Playgroud)

当为浮点数供电时,您可以找到数字的根。

  • 一旦你的数字变得非常大,这就会失去精度:`is_square(67108864**2 + 1)` 产生 `True`。 (5认同)

ene*_*dil 5

要坚持基于整数的算法,您可以查看二进制搜索的实现以找到平方根:

def is_square(n):
    if n < 0:
        return False
    if n == 0:
        return True
    x, y = 1, n
    while x + 1 < y:
        mid = (x+y)//2
        if mid**2 < n:
            x = mid
        else:
            y = mid
    return n == x**2 or n == (x+1)**2
Run Code Online (Sandbox Code Playgroud)

  • 最坏和平均的情况是“log n”,而您的解决方案是“n/2”。 (3认同)