寻找完美的广场

时间:2009-10-10 06:15:37

标签: python

我有这个python代码:

def sqrt(x):
    ans = 0
    if x >= 0:
        while ans*ans < x:
            ans = ans + 1
            if ans*ans != x:
                print x, 'is not a perfect square.'
                return None
            else:
                print x, ' is a perfect square.'
                return ans
    else:
        print x, ' is not a positive number.'
        return None

y = 16      
sqrt(y)

输出是:

16 is not a perfect square.

虽然这完美无缺:

x = 16
ans = 0
if x >= 0:
    while ans*ans < x:
        ans = ans + 1
        #print 'ans =', ans
    if ans*ans != x:
        print x, 'is not a perfect square'  
    else: print ans, 'is a perfect square'
else: print x, 'is not a positive number'

我做错了什么?

9 个答案:

答案 0 :(得分:10)

我想我会提供一个更简单的解决方案:

def is_square(n):
    return sqrt(n).is_integer()

这适用于n < 2**52 + 2**27 = 4503599761588224

示例:

>>> is_square(4)
True
>>> is_square(123)
False
>>> is_square(123123123432**2)
True

答案 1 :(得分:7)

正确缩进代码,让while语句执行到ans*ans < x

def sqrt(x):
    ans = 0
    if x >= 0:
        while ans*ans < x:
            ans = ans + 1

        if ans*ans != x:  # this if statement was nested inside the while
            print x, 'is not a perfect square.'
            return None
        else:
            print x, ' is a perfect square.'
            return ans
    else:
        print x, ' is not a positive number.'
        return None

y = 16          
print sqrt(y)

尝试here

答案 2 :(得分:1)

您的while循环只执行一次。无论它内部的if语句采用哪个分支,整个函数都会立即返回。

答案 3 :(得分:0)

编辑我修改了它,试了一下,然后就可以了。你只需要这段代码

一旦ans = 4,ans * ans就不再小于x。尝试ans * ans&lt; = x:而不仅仅是&lt;

def sqrt(x):
ans = 0
if x >= 0:
        while ans*ans <= x:                     
                if ans*ans == x:
                            print x, ' is a perfect square.'
                            return ans
        else:
            ans = ans + 1

答案 4 :(得分:0)

更改您的代码,使其显示ans以及x的值,以便您可以判断循环的执行次数。

答案 5 :(得分:0)

如果您的代码示例实际上是正确的,那么第一轮的while将在第一轮返回 - 总是。因此,x> 1的任何正值都将满足ans * ans = 1 * 1 = 1!= x,给出“x不是完美的正方形”。

你基本上需要让你的缩进正确 - 就像你在其他例子中所做的那样。再次 - 如果您的代码示例实际上是正确缩进的。试试这个:

def sqrt(x):
    ans = 0
    if x >= 0:
        while ans*ans < x:
            ans = ans + 1

        if ans*ans != x:
            print x, 'is not a perfect square.'
            return None
        else:
            print x, ' is a perfect square.'
            return ans
    else:
        print x, ' is not a positive number.'
        return None

答案 6 :(得分:0)

def isPerfectSquare(number):
    return len(str(math.sqrt(number)).split('.')[1]) == 1

答案 7 :(得分:0)

我认为这可能很短暂。

 def issquare():
      return (m**.5 - int(m**.5)==0)

答案 8 :(得分:-1)

如果目标是确定一个数字是否是一个完美的正方形,我认为使用数学内置函数会更简单(也许更有效),例如:

def is_perfect_square(n):
  if not ( ( isinstance(n, int) or isinstance(n, long) ) and ( n >= 0 ) ):
    return False 
  else:
    return math.sqrt(n) == math.trunc(math.sqrt(n))