В поисках идеальной площади - PullRequest
1 голос
/ 10 октября 2009

У меня есть этот код 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 ]

10 голосов
/ 24 апреля 2011

Просто подумал, что смогу предложить более простое решение:

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
7 голосов
/ 10 октября 2009

Правильный отступ вашего кода, чтобы оператор 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)

Попробуйте здесь .

1 голос
/ 10 октября 2009

Ваш цикл while выполняется только один раз. Независимо от того, какую ветвь занимает оператор if внутри, вся функция вернется немедленно.

0 голосов
/ 04 августа 2017

Я думаю, что это, вероятно, короткий.

 def issquare():
      return (m**.5 - int(m**.5)==0)
0 голосов
/ 10 июля 2014
def isPerfectSquare(number):
    return len(str(math.sqrt(number)).split('.')[1]) == 1
0 голосов
/ 22 апреля 2011

Если цель состоит в том, чтобы определить, является ли число идеальным квадратом, я бы подумал, что было бы проще (и, возможно, более эффективно) использовать встроенные математические функции, например ::10000

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))
0 голосов
/ 10 октября 2009

Если ваш пример кода на самом деле правильно с отступом, первый раунд 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
0 голосов
/ 10 октября 2009

Измените свой код, чтобы он отображал значение ans, а также x, чтобы вы могли определить, сколько раз цикл был выполнен.

0 голосов
/ 10 октября 2009

РЕДАКТИРОВАТЬ Я изменил его, опробовал, и он работает. Вам просто нужен этот кусок кода

Как только ans = 4, ans * ans уже не меньше x. Попробуйте пока ans * ans <= x: вместо <</p>

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...