Проверьте, является ли число идеальным квадратом - PullRequest
65 голосов
/ 22 марта 2010

Как я могу проверить, является ли число идеальным квадратом?

Скорость не имеет значения, пока просто работает.

Ответы [ 16 ]

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

Я думаю, что это работает и очень просто:

import math

def is_square(num):
    sqrt = math.sqrt(num)
    return sqrt == int(sqrt)

Неправильно для большого квадрата, например 152415789666209426002111556165263283035677490.

0 голосов
/ 12 марта 2017
import math

def is_square(n):
    sqrt = math.sqrt(n)
    return sqrt == int(sqrt)

Сбой для большой неквадрат, такой как 152415789666209426002111556165263283035677490.

0 голосов
/ 30 января 2017

Если вы хотите перебрать диапазон и сделать что-то для каждого числа, которое НЕ является идеальным квадратом, вы можете сделать что-то вроде этого:

def non_squares(upper):
    next_square = 0
    diff = 1
    for i in range(0, upper):
        if i == next_square:
            next_square += diff
            diff += 2
            continue
        yield i

Если вы хотите сделать что-то для каждого числа, которое является идеальным квадратом, генератор еще проще:

(n * n for n in range(upper))
0 голосов
/ 22 июня 2016

Существует ОЧЕНЬ простой способ сделать это.Найдите, сколько факторов имеет число (включая один и самого себя).Если оно имеет нечетное количество факторов, это квадрат.

def getFactors(n):
    '''Code for counting factors of n.'''
    result = 1 # not forgetting to count the number itself
    for i in range(1, n // 2 + 1):
         if n % i == 0:
             result += 1
    return result

Если результат функции нечетный, это квадрат.

РЕДАКТИРОВАТЬ:

Возможно, это не лучший метод для компьютерной программы, но это хороший метод для людей.

0 голосов
/ 23 марта 2010

Этот ответ относится не к заданному вами вопросу, а к неявному вопросу, который я вижу в опубликованном вами коде, т. Е. «Как проверить, является ли что-то целым?»

Первый ответ, который выКак правило, я получу ответ на этот вопрос "Не надо!"И это правда, что в Python проверка типов обычно не правильная вещь.

Для этих редких исключений, хотя вместо поиска десятичной точки в строковом представлении числа нужно сделать следующее:используйте функцию isinstance :

>>> isinstance(5,int)
True
>>> isinstance(5.0,int)
False

Конечно, это относится к переменной, а не к значению.Если бы я хотел определить, является ли значение целым числом, я бы сделал это:

>>> x=5.0
>>> round(x) == x
True

Но, как все остальные подробно рассмотрели, существуют проблемы с плавающей запятой, которые необходиморассматривается в большинстве неигровых примеров такого рода вещей.

0 голосов
/ 22 марта 2010
  1. Решите, как долго будет число.
  2. принять дельта 0,000000000000 ....... 000001
  3. посмотрите, больше ли (sqrt (x)) ^ 2 - x, равно ли / меньше, чем дельта, и определите, основываясь на ошибке дельты.
...