Python — проверьте, является ли число квадратом
Я уверен, что этот код работает. Но когда я делал тестовые примеры, например: test.expect( is_square( 4)) , он говорит, что это не то, что ожидалось.
Ваша функция фактически не работает, так как она немедленно возвращает False на первый найденный неквадратичный корень. Вместо этого вы захотите изменить свой код:
так что он возвращает false только после проверки всех возможных квадратных корней. Вы также можете посмотреть в math.sqrt() и float.is_integer() . Используя эти методы, ваша функция станет такой:
Имейте в виду, что этот метод не будет работать с очень большими числами, но ваш метод будет очень медленным с ними, поэтому вам придется выбирать, что использовать. Надеюсь, я помог!
Python — Проверьте, является ли число квадратом
Я уверен, что этот код работает. Но когда я сделал тестовые примеры, пример: test.expect( is_square( 4)) , это говорит о том, что значение не то, что ожидалось.
14 ответов
Ваша функция на самом деле не работает, так как она немедленно вернет False при первом найденном неквадратном корне. Вместо этого вы захотите изменить свой код так:
так что он возвращает false только после того, как все возможные квадратные корни были проверены. Вы также можете посмотреть в math.sqrt() а также float.is_integer() , Используя эти методы, ваша функция станет такой:
Имейте в виду, что этот метод не будет работать с очень большими числами, но ваш метод будет очень медленным с ними, поэтому вам придется выбирать, какой использовать. Надеюсь, я помог!
Чтобы придерживаться целочисленных алгоритмов, вы можете взглянуть на реализацию двоичного поиска для нахождения квадратного корня:
Основная идея философии Python — написать простой код. Чтобы проверить, является ли число идеальным квадратом:
При включении поплавка вы можете найти корень числа.
В Python 3.8+ используйте это:
Вы можете просто использовать simpy module import it as,
и вы можете проверить такой номер:
Он вернет логическое значение
Я думаю, что лучше всего использовать только «встроенную» целочисленную арифметику:
(Квадраты x**2 априори вычисляются более эффективно, чем произведения x*x. )
Согласно моим таймингам, это (по крайней мере, до
10 ^ 8) быстрее, чем sympy.numtheory.primetest.is_square .
(Я использую другое имя, чтобы было проще сравнивать их.) Последний сначала использует некоторые модульные проверки, которые должны значительно ускорить его, но у него так много накладных расходов на преобразование и тестирование ( int , as_int , квадраты становятся n-ми степенями с n=2, целые числа преобразуются из «маленьких» в целые с множественной точностью и обратно, . ), что все преимущество теряется. После множества тестов он примерно делает вышеописанное, используя ntheory.nthroot, что опять-таки является излишеством: предназначено для любого n-го корня, квадратный корень — это всего лишь один частный случай, и noting оптимизирован для этого случая. Некоторые подпрограммы там даже выполняют очень странные арифметические операции с плавающей запятой, включая умножение на 1.0000000001 и тому подобные ужасы. Однажды я получил следующее ужасное сообщение об ошибке: (исходный вывод имеет полный путь «C:\Users\Username\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\» вместо каждого «. » ниже. )
Это дает хорошее представление о бездне, в которую sympy безнадежно тонет.
Проверка, является ли число квадратом целого числа
Учитывая целое число, определите, является ли оно квадратным числом:
В математике квадратное число или идеальный квадрат — это целое число, являющееся квадратом целого числа; другими словами, это произведение некоторого целого числа на самого себя.
Примеры: -1: False, 0: True, 25 True | CodeWars
Первый вариант решения проходит все тесты, но не проходит по времени:
Второй вариант не проходит 3 теста (на 3, 26 и секретный):
Почему второй вариант не проходит данные тесты?
Нужен вариант, который занимает мало времени (не попадёт под ошибку Execution Timed Out (12000 ms) , а также не используются библиотеки.
Нет смысла делать цикл до n . Это примерно 100500 лишних операций в среднем. Если n равно 10001, то получится 9900 лишних итераций, ведь квадрат любого числа больше 100 уже больше 10000, так зачем их проверять. Нужно делать цикл до квадратного корня из n
Прибавление 1 позволяет убрать первую проверку на 0. Так что мы эту проверку лучше заменим на проверку отрицательных чисел:
![]()
Простейшее быстрое решение для любого целого числа — двоичный поиск для получения целой части квадратного корня и прямая проверка что его квадрат равен исходному числу:
![]()
Приведу, как ответ, так как часто сам сталкиваюсь с таким в задачах, а в комментариях именно этого способа не вижу. Хотя, если у вас случай именно для простого возведения в степень, то здесь вариант ниже не поможет. А вот в ряде схожих случаев будет просто необходим. Спасибо @CrazyElf за очень ценный комментарий к первому варианту ответа.
Использование оператора возведения в степень ** и деления по модулю % (а они часто используются вместе, при хэшировании, например) обычно затратно по времени при больших числах. В этом случае лучше использовать встроенную функцию pow .
К примеру, в случае возведения трехзначного числа в трехзначную степень ** ещё работает быстрее, чем pow , а вот для четырехзначных — уже наооброт. См. пример ниже сделанный на моем (далеко не самом новом) ноуте.
Особо важно это при всевозможных множественных применениях возведения в степень в программе, включая рекурсивные и т.д., т.е. при большом числе таких операций.
Python-сообщество
Написал функцию, но проблема в том, что при извлечении квадратного корня из числа, результат принимает вид “2.0” и проверка функцией isinstance показывает, что это число не целое. Не пойму как решить проблему с этой точкой?
#2 Июнь 18, 2022 16:22:21
Функция, проверяющая является ли число квадратом целого числа
Онлайн
#3 Июнь 19, 2022 07:53:33
Функция, проверяющая является ли число квадратом целого числа
Никак вы ее не решите. Результат извлечения корня это действительное число. В целое оно превратится только округлением. Но округлить можно любое действительное число.
Вам надо полностью менять алгоритм. воспользуйтесь тем что произведение целых целое число.