Определить, является ли заданное число квадратом простого числа

Дано натуральное число N. Определить, является ли оно квадратом простого числа.
Формат выходных данных: Вывести в выходной файл Yes, если N — квадрат простого и No в обратном случае.
При загрузке кода в контестер выдаёт, что код справился в 16 из 20 случаев, то есть я что-то не учёл, не могу понять что.
1 2 3 4 5 6 7 8
import math with open('./input.txt', mode='r', encoding='utf_8') as num: x = math.sqrt(float(num.readline())) with open('./output.txt', mode='w', encoding='utf_8') as out: if x % 1 == 0: out.write('Yes') else: out.write('No')
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Дано натуральное число N. Определить, является ли оно квадратом простого числа
Во входном файле записано N (N≤100000). Вывести в выходной файл Yes, если N — квадрат простого и.
Определить является ли число квадратом простого числа
Всем привет, нужна помощь. Есть задача: Дано натуральное число N. Определить, является ли оно.
Проверить, является ли заданное число N квадратом целого числа
Имя входного файла: input.txt Имя выходного файла: output.txt Ограничение по времени: 0.2 секунды.
Проверить является ли заданное число квадратом целого числа
Проверьте,является ли заданное число N квадратом целого числа.Если заданное число является.
Определить, можно ли заданное число представить в виде куба простого числа
Дано натуральное число N. Определить, можно ли его представить в виде куба простого числа. Я.
Python-сообщество
![]()
- Начало
- » Центр помощи
- » Функция, проверяющая является ли число квадратом целого числа
#1 Июнь 18, 2022 15:51:17
vladimir_vl_vlad Зарегистрирован: 2021-07-16 Сообщения: 27 Репутация: 0 Профиль Отправить e-mail
Функция, проверяющая является ли число квадратом целого числа
Написал функцию, но проблема в том, что при извлечении квадратного корня из числа, результат принимает вид “2.0” и проверка функцией isinstance показывает, что это число не целое. Не пойму как решить проблему с этой точкой?
def square_number(n): num = n sqrt = math.sqrt(num) print(type(sqrt)) if isinstance(sqrt, int): return True else: return False for number in range(1, 100): if square_number(number): print(f'Число является квадратом целого числа') else: print(f'Число не является квадратом целого числа')
#2 Июнь 18, 2022 16:22:21
xam1816 Зарегистрирован: 2020-05-11 Сообщения: 1262 Репутация: 108 Профиль Отправить e-mail
Функция, проверяющая является ли число квадратом целого числа
if sqrt.is_integer(): return True else: return False
#3 Июнь 19, 2022 07:53:33
doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail
Функция, проверяющая является ли число квадратом целого числа
Никак вы ее не решите. Результат извлечения корня это действительное число. В целое оно превратится только округлением. Но округлить можно любое действительное число.
Вам надо полностью менять алгоритм. воспользуйтесь тем что произведение целых целое число.
Как проверить является ли число полным квадратом python
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от \(-10~000\) до \( 10~000\) включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число является полным квадратом некоторого натурального числа, затем минимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности.
Решение:
Python
f = open('17var2.txt') nums = list(map(int, f.readlines())) pairs = 0 min_sum = 20000 for i in range(1, len(nums)): if nums[i-1] > 0 and int(nums[i-1]**0.5) ** 2 == nums[i-1] or \ nums[i] > 0 and int(nums[i]**0.5) ** 2 == nums[i]: pairs += 1 min_sum = min(min_sum, nums[i-1] + nums[i]) print(pairs, min_sum)
Ответ: \(41\) \(-9786\)
Проверка, является ли число квадратом целого числа
Учитывая целое число, определите, является ли оно квадратным числом: В математике квадратное число или идеальный квадрат — это целое число, являющееся квадратом целого числа; другими словами, это произведение некоторого целого числа на самого себя. Примеры: -1: False, 0: True, 25 True | CodeWars Первый вариант решения проходит все тесты, но не проходит по времени:
if n ==0: return True else: for i in range(0,n): if i*i==n: return True else: return False
Второй вариант не проходит 3 теста (на 3, 26 и секретный):
if n == 0: return True elif n
Почему второй вариант не проходит данные тесты? Нужен вариант, который занимает мало времени (не попадёт под ошибку Execution Timed Out (12000 ms) , а также не используются библиотеки.
Отслеживать
задан 6 июл 2022 в 5:06
user507635 user507635
if n ** 0.5 == 1 Что вы тут проверяете?
6 июл 2022 в 5:11
Почему не просто что-нить типа if ( (int) (n ** 0.5) ) ** 2 == n ?
6 июл 2022 в 5:16
@Akina В питоне приводить к инту надо вызывая его как функцию, это не C# ) Но так то вопрос совершенно точный
6 июл 2022 в 5:17
Если у вас питон 3.8: return math.isqrt(n) ** 2 == n
6 июл 2022 в 6:05
(n**.5).is_integer()
6 июл 2022 в 6:26
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Простейшее быстрое решение для любого целого числа - двоичный поиск для получения целой части квадратного корня и прямая проверка что его квадрат равен исходному числу:
def isqrt(n): low = 0 high = n + 1 # + 1 to process 0, 1 properly while low < high - 1: mid = (low + high) // 2 if n < mid ** 2: high = mid else: low = mid return low def is_square(n): return n >= 0 and isqrt(n) ** 2 == n
Отслеживать
ответ дан 6 июл 2022 в 11:57
Stanislav Volodarskiy Stanislav Volodarskiy
31.5k 3 3 золотых знака 19 19 серебряных знаков 55 55 бронзовых знаков
Нет смысла делать цикл до n . Это примерно 100500 лишних операций в среднем. Если n равно 10001, то получится 9900 лишних итераций, ведь квадрат любого числа больше 100 уже больше 10000, так зачем их проверять. Нужно делать цикл до квадратного корня из n
if n == 0: return True else: for i in range(n + 1): i2 = i * i # квадрат очередного числа if i2 == n: return True elif i2 > n: # если квадрат больше n, то нет смысла проверять дальше break return False # тут я убрал else и перенес строчку на уровень выше. Разницы никакой нет, а читаемость улучшилась.
Прибавление 1 позволяет убрать первую проверку на 0. Так что мы эту проверку лучше заменим на проверку отрицательных чисел:
if n < 0: return False else: for i in range(n + 1): i2 = i * i if i2 == n: return True elif i2 >n: break return False
Отслеживать
ответ дан 6 июл 2022 в 7:36
26.3k 7 7 золотых знаков 32 32 серебряных знака 48 48 бронзовых знаков
Прежде чем я воспользуюсь функцией math.sqrt(), мне придётся совершить import, что запрещено.
– user507635
6 июл 2022 в 7:44
Ну сорян, в условиях этого не написано ♂️
6 июл 2022 в 7:48
Да вообще непонятно, зачем нужен цикл, если можно просто взять корень и проверить, что он целый )
6 июл 2022 в 7:51
Дописал, а так же попробовал брать 2 - n, время сократилось на 0.04ms в тесте, но этого недостаточно.
– user507635
6 июл 2022 в 7:54
исправил на без квадратного корня
6 июл 2022 в 8:21
Приведу, как ответ, так как часто сам сталкиваюсь с таким в задачах, а в комментариях именно этого способа не вижу. Хотя, если у вас случай именно для простого возведения в степень, то здесь вариант ниже не поможет. А вот в ряде схожих случаев будет просто необходим. Спасибо @CrazyElf за очень ценный комментарий к первому варианту ответа.
Использование оператора возведения в степень ** и деления по модулю % (а они часто используются вместе, при хэшировании, например) обычно затратно по времени при больших числах. В этом случае лучше использовать встроенную функцию pow .
К примеру, в случае возведения трехзначного числа в трехзначную степень ** ещё работает быстрее, чем pow , а вот для четырехзначных - уже наооброт. См. пример ниже сделанный на моем (далеко не самом новом) ноуте.
import timeit import math print(timeit.timeit ('pow(5362, 2445)')) # 142 секунды print(timeit.timeit ('5362**2445')) # 147 секунд print(timeit.timeit ('(526 ** 252) % 10145')) # 2.87 секунды print(timeit.timeit ('pow(526, 252, 10145)')) # 0.90 секунд
Особо важно это при всевозможных множественных применениях возведения в степень в программе, включая рекурсивные и т.д., т.е. при большом числе таких операций.
Примечание: Есть ещё pow в библиотеке math , но с ним вообще что-то странное. Например, pow(53, 244) считается без ошибок, а math.pow(53, 244) выдает OverflowError: math range error . Так что его тут не рассматриваю.