Перейти к содержимому

Как проверить является ли число полным квадратом python

  • автор:

Квадрат числа в математике и программировании

В этой статье мы поговорим, что такое квадрат числа, как его найти, а также каким образом производятся подобные вычисления в программировании.

Квадратом Х называют произведение 2-х множителей, каждый из которых равен Х.

Обозначение квадрата осуществляется с помощью степени, то есть Х² читается «Х в квадрате».

Если говорить еще более простым языком, то квадратом можно назвать число, которое умножено само на себя. Таким образом, мы можем написать простейшую формулу вычисления Х 2 :

Почему вообще такое выражение называют квадратом X? Дело в том, что именно данной формулой выражают площадь квадрата, сторона которого равна X, то есть геометрически это значение можно представить в виде площади квадрата, имеющего целочисленную сторону.

Вывод тут прост: для решение поставленной задачи следует требуемое значение взять в качестве множителя дважды, а потом вычислить произведение. Соответственно:

10 2 = 10 ⋅ 10 = 100

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

Квадрат числа в математике и программировании

Также описанную математическую операцию можно рассматривать в контексте частного случая возведения в степень — ведь именно этим, по сути, она и является — возведением в степень 2.

Интерес представляет и числовая последовательность для квадратов целых чисел, являющихся неотрицательными (речь идет о последовательности A000290 в OEIS):

Квадрат числа в математике и программировании

Нельзя не сказать и про график y=x², где представлены целые значения x на отрезке 1-25.

Квадрат числа в математике и программировании

Квадратные числа

Если же говорить о натуральных числах из последовательности, упомянутой выше, в историческом контексте, то их всегда называли «квадратными». Квадратное числовое значение также называют полным либо точным квадратом, то есть целым значением, квадратный корень из которого можно извлечь нацело. К примеру, найти корень из 9 несложно (√9 = 3, т. к. 3 ⋅ 3 = 9). Не составляет проблем и вычислить корень из ста: (√100 = 10, ведь десять на десять равно сто).

Квадрат числа в математике и программировании

Легко понять, что сто — это квадратное число, так как его можно записать в виде 10 ⋅ 10 , плюс оно может быть представлено, как было сказано выше, в качестве площади квадрата со стороной, равной десяти. Таким образом, можно сделать вывод, что квадратное число включено в категорию классических фигурных чисел, то есть чисел, которые мы можем представить в виде геометрических фигур. Но в эту тему углубляться пока не будем.

А что в программировании?

Теперь давайте посмотрим, как все это работает в программировании. Для примера возьмем такой язык программирования, как Java (кстати, статья о том, как выполнять возведение в степень в Java, уже была).

Напишем простой метод по возведению любых числовых значений в квадрат:

public class Main

static int square(int x)

public static void main(String[] args)

Вы можете воспользоваться любым онлайн-компилятором для проверки этого кода. Также никто не мешает вписать любое число вместо десяти.

Квадрат числа в математике и программировании

Теперь воспользуемся простейшей программой для того, чтобы найти квадратный корень из 100:

public class Main

public static void main(String args[])

System.out.printf(«sqrt(%.2f) = %.2f%n», x, Math.sqrt(x));

Программа позволяет извлекать корень и из неквадратных значений. Ниже мы находим корень из 167:

Квадрат числа в математике и программировании

Да, в современную эпоху калькуляторов мало кто считает в уме. Вдобавок ко всему, сегодня даже не надо покупать настоящий калькулятор, так как калькулятор есть в любом мобильном телефоне, не говоря уже об онлайн-калькуляторах, коих существует огромное количество. Однако это не значит, что можно забыть азы алгебры. Не зря же великий русский ученый Михаил Ломоносов когда-то сказал:

Квадрат числа в математике и программировании

  • https://calculator888.ru/tablitsa-kvadratov;
  • http://www.for6cl.uznateshe.ru/kvadrat-chisla/;
  • https:/ru.wikipedia.org/.

Python-сообщество

[RSS Feed]

  • Начало
  • » Центр помощи
  • » Функция, проверяющая является ли число квадратом целого числа

#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 Сообщения: 1261 Репутация: 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

Функция, проверяющая является ли число квадратом целого числа

Никак вы ее не решите. Результат извлечения корня это действительное число. В целое оно превратится только округлением. Но округлить можно любое действительное число.
Вам надо полностью менять алгоритм. воспользуйтесь тем что произведение целых целое число.

Проверка, является ли число квадратом целого числа

Учитывая целое число, определите, является ли оно квадратным числом: В математике квадратное число или идеальный квадрат — это целое число, являющееся квадратом целого числа; другими словами, это произведение некоторого целого числа на самого себя. Примеры: -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

Сортировка: Сброс на вариант по умолчанию

Нет смысла делать цикл до 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.2k 7 7 золотых знаков 31 31 серебряный знак 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

Простейшее быстрое решение для любого целого числа - двоичный поиск для получения целой части квадратного корня и прямая проверка что его квадрат равен исходному числу:

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
31k 3 3 золотых знака 19 19 серебряных знаков 55 55 бронзовых знаков

Приведу, как ответ, так как часто сам сталкиваюсь с таким в задачах, а в комментариях именно этого способа не вижу. Хотя, если у вас случай именно для простого возведения в степень, то здесь вариант ниже не поможет. А вот в ряде схожих случаев будет просто необходим. Спасибо @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 . Так что его тут не рассматриваю.

ЕГЭ по информатике 2022 - Задание 17 (Пишем программу)

Привет! Сегодня поговорим о 17 задании ЕГЭ по информатике 2022.

В 17 задании нужно считать числа из файла, проанализировать их и ответить на вопрос задачи.

Будем решать задание на языке Python.

Задача (Минимальное значение)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа делятся нацело на 7, затем минимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например для последовательности из пяти элементов: 7; 14; 21; -7; 4 - ответ 3 14.

Напишем программу на языке Python.

f=open('17_1.txt') count=0 sm=20000 n1=int(f.readline()) for s in f.readlines(): n2=int(s) if n1%7==0 and n2%7==0: count=count+1 sm=min(n1+n2, sm) n1=n2 print(count) print(sm)

В начале подвязываемся к файлу с помощью команды open().

Переменная count отвечает за количество пар, удовлетворяющих условию задачи. Переменная sm - это минимальная сумма элементов подходящих пар.

В начале в переменную sm кладём максимальное число, которое теоретически может получится (10000 + 10000). Это делается для того, чтобы это значение можно было легко "победить" при поиске минимального значения.

Затем считываем в переменную n1 первое число. C помощью конструкции " for s in f.readlines():" можно перебрать остальные числа из файла. В цикле считываем второе число для пары в переменную n2.

После того, как два числа у нас есть, мы анализируем эти элементы на условие задачи. Если одновременно два числа из пары делятся на 7, то мы подсчитываем такую пару.

Если пара подходит, то проверяем сумму элементов этой пары на минимальность. В переменную sm заносится минимальное значение из прежнего значения sm и претендующего нового значения n1+n2.

В конце цикла нужно переложить второе число в переменную n1, чтобы очередное число из файла считалось в переменную n2. Тем самым мы получим новую пару чисел.

Задача (Проверяем на что оканчивается число)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются или на 3, или на 5 (можно неодновременно), затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например для последовательности из пяти элементов: 3; 15; 25; -3; 4 - ответ 3 40.

f=open('17_2.txt') count=0 sm=-20000 n1=int(f.readline()) for s in f.readlines(): n2=int(s) if (abs(n1)%10==3 or abs(n1)%10==5) and (abs(n2)%10==3 or abs(n2)%10==5): count=count+1 sm=max(n1+n2, sm) n1=n2 print(count) print(sm)

Т.к. мы ищем максимальную сумму, то в начале в переменную sm кладём наоборот минимальное значение (-10000-10000=-20000).

Когда ищем на что оканчивается положительное число, мы применяем конструкцию x%10. Т.е. находим остаток от деления на 10. Пример: 16 % 10 = 6. Но для отрицательных чисел это не работает -16 % 10 = 4. Почему такой ответ получается, можете посмотреть в этом видео: https://www.youtube.com/watch?v=BRfgE3pP0_c. Поэтому, чтобы правильно найти на что оканчивается число, применяем функцию abs(), что означает модуль числа.

Здесь мы должны логические выражения для первого и второго числа взять в скобки, потому что логическая операция И имеет приоритет перед ИЛИ.

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число является полным квадратом некоторого натурального числа, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например для последовательности из пяти элементов: 9; 15; 23; -3; 4 - ответ 2 24.

f=open('17_3.txt') count=0 sm=-20000 n1=int(f.readline()) for s in f.readlines(): n2=int(s) if (n1>0 and (int(n1 ** 0.5) ** 2) == n1) or (n2>0 and (int(n2 ** 0.5) ** 2) == n2) : count=count+1 sm=max(n1+n2, sm) n1=n2 print(count) print(sm)

Здесь мы извлекаем корень из числа с помощью возведения в степень 0.5. Округляем результат в меньшую сторону с помощью функции int(). А затем снова возводим в квадрат. Если мы получили изначальное число, значит, это число и есть полный квадрат некоторого натурального числа.

Возведение в степень в 0.5 работает и для отрицательных чисел. Т.к. в задаче имеют ввиду квадраты натуральных чисел, то мы работаем только с числами, которые больше нуля.

В файле 17-3.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество троек элементов последовательности, в которых числа расположены в порядке возрастания, затем минимальную из разностей наибольшего и наименьшего элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

f=open('17-3.txt') count=0 rz=20000 n1=int(f.readline()) n2=int(f.readline()) for s in f.readlines(): n3 = int(s) if n1 < n2 < n3: count=count+1 mx = max(n1, n2, n3) mn = min(n1, n2, n3) rz = min(rz, mx-mn) n1=n2 n2=n3 print(count, rz)

С тройками решаем аналогично. До цикла считываем два числа. Внутри цикла считываем третье число.

В конце цикла перекладываем числа: второе число в n1, третье число в n2.

Задача (ЕГЭ по информатике, 2023)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -100000 до 100000 включительно. Определите количество троек элементов последовательности, в которых не более двух из трёх элементов являются четырёхзначными числами, а сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 13.

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

В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

В начале нужно найти максимальный элемент всей последовательности, который оканчивается на 13.

f=open('17_2023_1.txt') mx=-10**10 for s in f.readlines(): x=int(s) if abs(x)%100==13: mx=max(mx, x) print(mx)

Получается число 97213. Важно не забыть, что числа могут быть и отрицательные. В этом случае, когда мы проверяем окончание числа, нужно поставить модуль!

Теперь напишем основную программу для 17 задания из ЕГЭ по информатике.

def F(n): if (-10000 < n < -999) or (999 < n < 10000): return True else: return False f=open('17_2023_1.txt') n1=int(f.readline()) n2=int(f.readline()) k=0 mx=-10**10 for s in f.readlines(): n3=int(s) c=0 if F(n1): c=c+1 if F(n2): c=c+1 if F(n3): c=c+1 if cand (n1+n2+n3) max(mx, n1+n2+n3) n1=n2 n2=n3 print(k, mx)

Чтобы проверить число тройки, является ли оно четырёхзначным, создали специальную функцию F.

После того, как три числа из тройки зачитаны, для каждой тройки заводим счётчик c. Так мы сможем отследить, сколько чисел удовлетворяют условию задачи для каждой тройки.

Проверяем каждую тройку, подходит ли она по условию задачи.

Задача (Любой порядок элементов)

В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 9, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.

Первый способ (Красивый).

f = open('17.txt') count_0 = 0 count_1 = 0 count_2 = 0 count_3 = 0 count_4 = 0 count_5 = 0 count_6 = 0 count_7 = 0 count_8 = 0 mx1_0 = 0 mx2_0 = 0 mx_1 = 0 mx_2 = 0 mx_3 = 0 mx_4 = 0 mx_5 = 0 mx_6 = 0 mx_7 = 0 mx_8 = 0 for s in f.readlines(): n=int(s) if n%9==0: count_0 = count_0 + 1 if n>mx1_0: if n>mx2_0: mx1_0 = mx2_0 mx2_0 = n else: mx1_0 = n if n%9==1: count_1 = count_1 + 1 mx_1 = max(mx_1, n) if n%9==2: count_2 = count_2 + 1 mx_2 = max(mx_2, n) if n%9==3: count_3 = count_3 + 1 mx_3 = max(mx_3, n) if n%9==4: count_4 = count_4 + 1 mx_4 = max(mx_4, n) if n%9==5: count_5 = count_5 + 1 mx_5 = max(mx_5, n) if n%9==6: count_6 = count_6 + 1 mx_6 = max(mx_6, n) if n%9==7: count_7 = count_7 + 1 mx_7 = max(mx_7, n) if n%9==8: count_8 = count_8 + 1 mx_8 = max(mx_8, n) count = (count_1*count_8) + (count_2*count_7) + (count_3*count_6) + (count_4*count_5) + (count_0*(count_0-1)//2) mx = max(mx_1 + mx_8, mx_2 + mx_7, mx_3 + mx_6, mx_4 + mx_5, mx1_0 + mx2_0) print(count, mx)

Здесь мы ищем количество элементов, у которых остаток при делении на 9 равен нулю, единице, двойке, . и до 8. Подсчитываем эти данные соответственно в переменные count_0, count_1, count_2 . и т.д.

Так же находим максимальное число, которое имеет при делении на 9 остаток равный единице, двойке, . и т.д. Для чисел, которые имеют остаток при делении на 9 ноль, находим два максимальных числа.

После того, как результаты находятся в нужных переменных, можно вычислить ответ к задаче.

Если, к примеру, взять число для которого остаток равен 1 и число для которого остаток равен 8, то их сумма будет делится на 9. Найдём количество пар, если нам известно количество и тех, и тех чисел.

ЕГЭ по информатике 2022 - задание 17 (Числа не по порядку)

Значит, просто нужно перемножить два числа, к примеру, count_1*count_8.

Для чисел, которые делятся на 9 (т.е. остаток равен нулю), количество пар считается немного по-другому. Такие числа можно суммировать между собой, всё равно сумма тоже будет делится на 9. Путь есть у нас количество чисел count_0, которые делятся на 9. Тогда найдём количество пар, которые можно составить из этих элементов.

Здесь вспомним метод умножения, о котором было написано в этой статье.

ЕГЭ по информатике 2022 - задание 17 (Числа не по порядку)

Найдём количество таких пар, если каждый элемент можно использовать 1 раз. Получается count_0*(count_0-1). Но т.к. в нашем случае пара, когда элементы находятся в одном порядке и в обратном, является одной и той же, то нужно это количество поделить на 2. Т.е количество пар будет (count_0*(count_0-1))/2.

Второй способ (Перебор).

f = open('17.txt') count=0 mx=0 a = [] #Считываем все числа в массив a for s in f.readlines(): n = int(s) a.append(n) # Перебираем все варианты и подсчитываем пары, отвечающие условию задачи. for i in range(0, len(a)): for j in range(i+1, len(a)): if (a[i]+a[j])%9==0: count = count + 1 mx = max(a[i]+a[j], mx) print(count, mx)

В этом решении сначала считываем все числа в массив a.

Далее берём число и начинаем его комбинировать со всеми числами, которые стоят после этого числа. Таким образом, мы переберём все возможные комбинации, и у нас не будут пары повторяться.

5553635 19998

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *