Учитывая положительное число, проверьте, является ли оно идеальным квадратом, не используя встроенную библиотечную функцию. Полный квадрат — это число, являющееся квадратом целого числа.
Например,
Input: n = 25
Output: true
Explanation: 25 is a perfect square since it can be written as 5×5.
Input: n = 20
Output: false
Explanation: 20 is not the product of an integer with itself.
1. Использование свойства Perfect Square
Каждый совершенный квадрат удовлетворяет тому свойству, что он представляет собой сумму нечетных чисел, начинающихся с единицы. Например,
1 = 1
4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
25 = 1 + 3 + 5 + 7 + 9
…
n = 1 + 3 + 5 + … + (2*n-1)
Мы можем использовать это свойство, чтобы определить, является ли число n
совершенный квадрат или нет. Идея состоит в том, чтобы многократно вычитать нечетные числа из n
, начиная с 1, пока не станет 0 или отрицательным. Если значение достигает 0 в какой-то момент, мы можем сказать, что число является идеальным квадратом. Однако, если значение становится отрицательным, не достигая 0, число не может быть идеальным квадратом. Это показано ниже на C++, Java и Python.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> #include <vector> using namespace std; bool isPerfectSquare(int n) { // начинаем с нечетного числа 1 int odd = 1; // цикл до тех пор, пока значение не станет 0 или отрицательным while (n > 0) { // вычесть следующее нечетное число из `n` n = n — odd; // берем следующее нечетное число для следующей итерации odd = odd + 2; } // только идеальный квадрат достигнет значения 0 return n == 0; } int main() { int n = 25; cout << std::boolalpha << isPerfectSquare(n); return 0; } |
Скачать Выполнить код
результат:
true
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Main { public static boolean isPerfectSquare(int n) { // начинаем с нечетного числа 1 int odd = 1; // цикл до тех пор, пока значение не станет 0 или отрицательным while (n > 0) { // вычесть следующее нечетное число из `n` n = n — odd; // берем следующее нечетное число для следующей итерации odd = odd + 2; } // только идеальный квадрат достигнет значения 0 return n == 0; } public static void main(String[] args) { int n = 25; System.out.println(isPerfectSquare(n)); } } |
Скачать Выполнить код
результат:
true
Python
def isPerfectSquare(n): # начинаются с нечетного числа 1 odd = 1 Цикл #, пока значение не станет 0 или отрицательным while n > 0: n = n — odd # вычесть следующее нечетное число из `n` odd = odd + 2 # берет следующее нечетное число для следующей итерации # только правильный квадрат достигнет значения 0 return n == 0 if __name__ == ‘__main__’: n = 25 print(isPerfectSquare(n)) |
Скачать Выполнить код
результат:
True
Временная сложность вышеописанной процедуры O(n) и требует постоянного дополнительного пространства, где n
является заданным числом.
2. Использование бинарного поиска
Мы можем улучшить временную сложность решения O(log(n)) с помощью алгоритм бинарного поиска. Идея состоит в том, чтобы начать с пространства поиска [low, high] = [0, n]
и попробуй найти mid
значение, удовлетворяющее условию mid × mid == n
. По результатам сравнения между n
а также mid × mid
, процедура будет увеличиваться low
, декремент high
, или вернуться true
если n
является продуктом mid
с собой.
Вот программа на C++, Java и Python, которая демонстрирует это:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream> #include <vector> using namespace std; bool isPerfectSquare(int n) { // установить пространство поиска в [0, n]. int low = 0, high = n; while (low <= high) { // вычислить середину int mid = low + ((high — low)/2); // если `mid×mid` равно `n`, вернуть true if (mid * mid == n) { return true; } // если `mid×mid` меньше `n`, обновить `low` до `mid + 1` if (mid * mid < n) { low = mid + 1; } // в противном случае обновить `high` до `mid — 1` else { high = mid — 1; } } // мы достигнем этой точки, если число не является полным квадратом return false; } int main() { int n = 25; cout << std::boolalpha << isPerfectSquare(n); return 0; } |
Скачать Выполнить код
результат:
true
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class Main { public static boolean isPerfectSquare(int n) { // установить пространство поиска в [0, n]. int low = 0, high = n; while (low <= high) { // вычислить середину int mid = low + ((high — low)/2); // если `mid×mid` равно `n`, вернуть true if (mid * mid == n) { return true; } // если `mid×mid` меньше `n`, обновить `low` до `mid + 1` if (mid * mid < n) { low = mid + 1; } // в противном случае обновить `high` до `mid — 1` else { high = mid — 1; } } // мы достигнем этой точки, если число не является полным квадратом return false; } public static void main(String[] args) { int n = 25; System.out.println(isPerfectSquare(n)); } } |
Скачать Выполнить код
результат:
true
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def isPerfectSquare(n): # устанавливает пространство поиска в [0, n]. low, high = 0, n while low <= high: mid = int(low + ((high — low) / 2)) # рассчитать мид #, если `mid×mid` равно `n`, вернуть true if mid * mid == n: return True #, если `mid×mid` меньше, чем `n`, обновить `low` до `mid + 1` if mid * mid < n: low = mid + 1 #, в противном случае обновить «высокий» до «средний — 1» else: high = mid — 1 # мы достигнем этой точки, если число не является полным квадратом return False if __name__ == ‘__main__’: n = 25 print(isPerfectSquare(n)) |
Скачать Выполнить код
результат:
True
3. Использование метода Ньютона
Наконец, мы можем использовать метод Ньютона для вычисления квадратных корней. Математическая логика метода Ньютона выходит за рамки этой статьи. Алгоритм может быть реализован следующим образом на C++, Java и Python:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <vector> using namespace std; bool isPerfectSquare(int n) { int i = n; while (i * i > n) { i = (i + n / i) / 2; } return i * i == n; } int main() { int n = 25; cout << std::boolalpha << isPerfectSquare(n); return 0; } |
Скачать Выполнить код
результат:
true
Java
class Main { public static boolean isPerfectSquare(int n) { int i = n; while (i * i > n) { i = (i + n / i) / 2; } return i * i == n; } public static void main(String[] args) { int n = 25; System.out.println(isPerfectSquare(n)); } } |
Скачать Выполнить код
результат:
true
Python
def isPerfectSquare(n): i = n while i * i > n: i = (i + n / i) / 2 return i * i == n if __name__ == ‘__main__’: n = 25 print(isPerfectSquare(n)) |
Скачать Выполнить код
результат:
True
0 / 0 / 0 Регистрация: 15.04.2022 Сообщений: 1 |
|
1 |
|
15.04.2022, 10:57. Показов 6419. Ответов 20
Необходимо найти все числа на отрезке от А до B (А и B вводим) , которые являются полными квадратами. Если в заданном диапазоне таких чисел нет вывести -1. Пример вводных данных и ответа : Ввод : 1 30 Ввод : 10 50
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
15.04.2022, 10:57 |
20 |
Пифагор 2169 / 1652 / 840 Регистрация: 10.01.2015 Сообщений: 5,184 |
||||
15.04.2022, 11:57 |
2 |
|||
1 |
eaa |
15.04.2022, 13:28
|
Не по теме: Пифагор, медленно) можно быстрее же посчитать
0 |
Пифагор 2169 / 1652 / 840 Регистрация: 10.01.2015 Сообщений: 5,184 |
||||
15.04.2022, 13:37 |
4 |
|||
eaa, а почему «не по теме»? Полагаю, через циклы без
0 |
Gdez 7259 / 4048 / 1780 Регистрация: 27.03.2020 Сообщений: 6,875 |
||||
15.04.2022, 13:49 |
5 |
|||
Пифагор,
0 |
2169 / 1652 / 840 Регистрация: 10.01.2015 Сообщений: 5,184 |
|
15.04.2022, 14:00 |
6 |
Gdez, это получается быстрее? Тут и модуль подключается, и приведение к типу, и создание списка, и сам
0 |
Gdez 7259 / 4048 / 1780 Регистрация: 27.03.2020 Сообщений: 6,875 |
||||
15.04.2022, 14:06 |
7 |
|||
Пифагор,
1 |
2169 / 1652 / 840 Регистрация: 10.01.2015 Сообщений: 5,184 |
|
15.04.2022, 14:26 |
8 |
Gdez, а за счет чего код так быстро исполняется?
0 |
7259 / 4048 / 1780 Регистрация: 27.03.2020 Сообщений: 6,875 |
|
15.04.2022, 14:32 |
9 |
Пифагор, допустим диапазон = [1, 100]. Он содержит 10 полных квадратов. У меня счетчик цикла == 10. У Вас == 100
1 |
2169 / 1652 / 840 Регистрация: 10.01.2015 Сообщений: 5,184 |
|
15.04.2022, 14:42 |
10 |
Gdez, цифры увидел, но не совсем понял, как они формируются. В данном случае, 10 циклов вместо 100 получается из-за отсутствия ветвления и сравнения?
0 |
7259 / 4048 / 1780 Регистрация: 27.03.2020 Сообщений: 6,875 |
|
15.04.2022, 15:38 |
11 |
Пифагор,
1 |
Catstail Модератор 35574 / 19473 / 4072 Регистрация: 12.02.2012 Сообщений: 32,510 Записей в блоге: 13 |
||||
15.04.2022, 16:21 |
12 |
|||
Не могу одобрить эти коды. Они используют плавающую точку, а значит для 16-и и более разрядных чисел начнут безбожно врать. Смотрите:
3 |
enx |
15.04.2022, 17:11
|
Не по теме: Catstail, как всегда, чистая алгоритмическая магия :drink:
0 |
eaa Status 418 3856 / 2136 / 571 Регистрация: 26.11.2017 Сообщений: 5,004 Записей в блоге: 2 |
||||
15.04.2022, 22:59 |
14 |
|||
1 |
Модератор 35574 / 19473 / 4072 Регистрация: 12.02.2012 Сообщений: 32,510 Записей в блоге: 13 |
|
16.04.2022, 11:10 |
15 |
eaa, да… Но интересно же сделать самому.
0 |
Status 418 3856 / 2136 / 571 Регистрация: 26.11.2017 Сообщений: 5,004 Записей в блоге: 2 |
|
16.04.2022, 11:40 |
16 |
Catstail, полностью согласен. Но этот бин.поиск будет медленный. когда много чисел близких к 1018 из которых нужно корень вычислять. нужно другой писать, isqrt быстрый.
0 |
Модератор 35574 / 19473 / 4072 Регистрация: 12.02.2012 Сообщений: 32,510 Записей в блоге: 13 |
|
16.04.2022, 12:39 |
17 |
eaa, а есть более быстрые алгоритмы? Бин поиск — логарифмический.
0 |
Status 418 3856 / 2136 / 571 Регистрация: 26.11.2017 Сообщений: 5,004 Записей в блоге: 2 |
|
16.04.2022, 13:38 |
18 |
Catstail, если взять не икс пополам правую границу. Добавлено через 51 минуту
1 |
Модератор 35574 / 19473 / 4072 Регистрация: 12.02.2012 Сообщений: 32,510 Записей в блоге: 13 |
|
16.04.2022, 14:00 |
19 |
eaa, а как он реализован? На Питоне? Добавлено через 4 минуты
0 |
Status 418 3856 / 2136 / 571 Регистрация: 26.11.2017 Сообщений: 5,004 Записей в блоге: 2 |
|
16.04.2022, 14:37 |
20 |
модуль math, на си же.
метод Ньютона тот же бинпоиск.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
16.04.2022, 14:37 |
Помогаю со студенческими работами здесь Найти количество чисел, которые не превосходят числа A и являются полными квадратами некоторого натурального числа Найти произведение чисел, которые не превосходят 4000 и являются полными квадратами некоторого натурального числа Есть ли совершенные числа из промежутка [2, n], которые являются полными квадратами Найдите все числа, являющиеся полными квадратами, на отрезке от A до B Выведите все числа на отрезке от a до b, являющиеся полными квадратами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
I think the best take, using only «built-in» integer arithmetic, is:
def issquare(n): return math.isqrt(n)**2==n
(Squares x**2 are a priori more efficiently computed than products x*x…)
According to my timings, this is (at least up to ~ 10^8) faster than sympy.numtheory.primetest.is_square
.
(I use a different name to make it easier to compare the two.)
The latter is first using some modular checks that should speed it up considerably, but it has so much conversion and testing overhead (int
, as_int
, squares become n-th powers with n=2, integers are converted from «small» to multiprecision integers and back, …) that all the advantage is lost. After a lot of tests, it roughly does the above, using ntheory.nthroot, which is again an overkill: designed for any n-th root, the square root is just one special case, and noting is optimized for this case. Some subroutines there even do very weird floating point arithmetics including multiplication with 1.0000000001 and similar horrors… I once got the following horrible error message: (The original output has the full path "C:UsersUsernameAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packages"
instead of each «…» below…)
File "...sympyntheoryprimetest.py", line 112, in is_square
return integer_nthroot(n, 2)[1]
File "...sympycorepower.py", line 86, in integer_nthroot
return _integer_nthroot_python(y, n)
File "...sympycorepower.py", line 94, in _integer_nthroot_python
x, rem = mpmath_sqrtrem(y)
File "...mpmathlibmplibintmath.py", line 284, in sqrtrem_python
y = isqrt_small_python(x)
File "...mpmathlibmplibintmath.py", line 217, in isqrt_small_python
r = int(x**0.5 * 1.00000000000001) + 1
KeyboardInterrupt
This gives a good idea of the abyss into which sympy
‘s is_square
hopelessly drowns…
Documentation: see is_square
in Sympy’s Ntheory Class Reference
P.S.: FWIW, regarding other answers suggesting to use round()
etc, let me just mention here that ceil(sqrt(n))**2 < n
(!!), for example when n is the 26th and 27th primorial — not extremely large numbers! So, clearly, use of math.sqrt
is not adequate.
Время чтения 3 мин.
Метод Square() в Numpy возвращает массив элементов, возведенных в квадрат.
Содержание
- Что такое функция np.square() в Python?
- Синтаксис
- Параметры
- Возвращаемое значение
- Примечание
- Пример
- Массив с плавающей запятой Numpy Square()
- Квадрат Numpy для комплексных чисел
- Параболический график квадратичной функции
- Передача пустого массива
- Указание dtype
Функция np.square() используется в Python для нахождения квадрата каждого элемента в заданном массиве. Метод numpy Square() принимает четыре параметра: arr, out, where и dtype и возвращает новый массив со значением аргумента в виде квадрата элементов исходного массива.
Чтобы найти квадрат массива, вы можете использовать метод numpy Square(). Исходный массив остается неизменным. np Square() — это служебная функция, позволяющая быстро получить квадрат элементов матрицы.
Синтаксис
numpy.square(arr, out=None, where=True, dtype=None) |
Параметры
- arr: введите array_like, содержащий элементы, которые нужно возвести в квадрат.
- out :(ndarray, None или кортеж ndarray) [Необязательный параметр] Указывает альтернативный выходной массив, в который помещается результирующий продукт. Он должен иметь ту же или широковещательную форму, что и ожидаемый результат.
- where:(array_like) [Необязательный параметр] Это элементы, которые необходимо включить.
- dtype : [Необязательный параметр] Указывает тип возвращаемого массива.
Возвращаемое значение
Квадрат каждого из элементов в переданном массиве имеет форму массива.
Примечание
- Если входной массив пуст, метод Square() возвращает пустой массив.
- Этот метод может показать параболический график квадратичной функции.
Пример
В следующем примере демонстрируется использование метода Square().
import numpy as np arr1 = [1, 2, 3, 4, 5] arr2 = np.square(arr1) print(arr2) |
Выход:
Массив с плавающей запятой Numpy Square()
Возьмем массив numpy со значениями с плавающей запятой.
import numpy as np arr1 = [1.1, 2.1, 1.9, 4.6] arr2 = np.square(arr1) print(arr2) |
Выход:
Теперь давайте возьмем два целых числа и два значения с плавающей запятой и посмотрим на результат.
import numpy as np arr1 = [1.1, 21, 19, 4.6] arr2 = np.square(arr1) print(arr2) |
Выход:
Квадрат Numpy для комплексных чисел
Чтобы найти квадрат полных чисел, используйте метод np.square().
Следующий код демонстрирует случай, когда элемент массива является комплексным числом.
import numpy as np arr1 = [2 + 4j] arr2 = np.square(arr1) print(arr2) |
Выход:
Параболический график квадратичной функции
Следующий пример демонстрирует параболический график квадратичной функции. Для этого примера вам необходимо сначала установить библиотеку matplotli.
Теперь посмотрите на следующий код.
import numpy as np import matplotlib.pyplot as plt x = np.linspace(start=—100, stop=100, num=100, endpoint=True) plt.title(«Green : Squared valuesnOrange : Linear plot») plt.plot(x, np.square(x), color=‘green’) plt.plot(x, x, color=‘orange’) plt.show() |
Выход:
Вы можете увидеть параболический график метода Square() в Numpy.
Передача пустого массива
Если мы передадим пустой массив в функцию np.square(), она вернет пустой массив.
В следующем примере демонстрируется случай, когда передается пустой массив.
import numpy as np arr1 = [] arr2 = np.square(arr1) print(arr2) |
Выход:
В следующем примере показано использование параметра where, чтобы указать, какие элементы возводить в квадрат. Для остальных элементов возвращается значение мусора.
import numpy as np arr1 = [1, 2, 3, 4, 5] arr2 = np.square(arr1, where=[True, False, True, False, True]) print(arr2) |
Выход:
[ 1 —4611677251740556998 9 140266991895344 25] |
Из вывода вы можете видеть, что он возвращает мусорные значения для остальных элементов.
Указание dtype
В следующем примере демонстрируется случай, когда dtype указывает тип данных элементов.
import numpy as np arr1 = [5, 2, 1] arr2 = np.square(arr1, dtype=np.int8) print(arr2.dtype == np.int8) arr1 = np.array([5, 2, 1], dtype=np.int8) print(np.square(arr1).dtype == np.int) print(np.square(arr1).dtype == np.int8) |
Выход:
В приведенном выше коде мы определили тип данных от arr2 до int8. В следующем примере демонстрируется применение этого метода в простом контексте программирования.
Дана последовательность чисел, найти сумму их квадратов.
import numpy as np n = int(input(«Count: «)) numbers = [] for i in range(n): numbers.append(int(input())) numbers = np.square(numbers) res = sum(numbers) print(res) |
Выход:
Test Case 1: ->python3 example7.py Count: 4 1 2 3 4 30 Test Case 2: ->python3 example7.py Count: 3 1 2 3 14 |
В этом примере мы взяли два тестовых примера, чтобы продемонстрировать сумму и квадрат чисел. Мы использовали такие функции, как int(), input(), range(), append(), Square() и sum().
Чтобы возвести число в квадрат, нужно умножить это число само на себя. В Python есть несколько способов сделать это.
Во-первых, вы можете напрямую умножить число само на себя ( число * число ). Однако в данной статье мы покажем вам три способа сделать это без перемножения чисел напрямую. Ведь когда это возведение в квадрат, нужно написать число только два раза. Но что если потребуется возвести число в куб, в пятую степень, в десятую? Тогда непосредственно перемножать число на само себя N раз покажется не такой уж привлекательной идей.
Существует три способа возведения числа в указанную степень в Python:
- оператор возведения в степень **
- встроенная функция pow()
- функция math.pow() из математического модуля math
Как возвести число в квадрат при помощи оператора возведения в степень (**)
** называется оператором возведения в степень. Синтаксис данного оператора выглядит следующим образом:
Здесь number — число, а exponent — степень, в которую нужно это число возвести. В целом это выражение оценивается как number * number. (количество number равно значению показателя степени).
С помощью этого оператора мы можем возвести число в любую степень, в том числе и в квадрат. К примеру, чтобы найти квадрат числа 5, вы можете написать следующий код:
Оператор степени оценивает выражение как 5 * 5 , в результате чего мы получаем 25.
Английский для программистов
Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас
Конечно, этот оператор можно использовать не только для возведения чисел в квадрат. Вы можете возвести любое число в любую степень. Например, чтобы получить пять в седьмой степени (5 7 ), нужно написать следующий код:
Как видите, это намного удобнее, чем писать number * number … N раз.
Как использовать функцию pow() в Python
Python также имеет встроенную функцию pow() , которая возводит число в указанную степень. Синтаксис данной функции выглядит следующим образом:
Приведенный выше код интерпретируется как base exponent , то есть число base в степени exponent .
Функция pow() принимает два аргумента: число (известное как основание или base ) и степень, в которую число должно быть возведено (показатель степени — exponent ).
Например, чтобы найти квадрат числа 5, мы можем воспользоваться этой функцией следующим образом:
Не трудно догадаться, что эту функцию также можно использовать для возведения в куб, седьмую и любую другую степень. Просто будет меняться значение степени exponent .
Кроме того, функция pow() также может принимать и третий аргумент: modulo (модуль). Знак модуля — % . Этот аргумент оценивает остаток при делении одного числа на другое.
Например, 5 % 2 дает 1, потому что 5 разделить на 2 равно 2, а остаток — 1. То есть функция pow() , когда ей переданы три аргумента, делает следующее:
- Возводит number (первый аргумент) в степень exponent (второй аргумент)
- Находит остаток от деления результата на modulo (третий аргумент)
Применение функции pow() с тремя аргументами выглядит следующим образом:
Согласно документации Python по pow() , этот подход работает более эффективно, чем pow(5,2) % 3 .
Числа и математические функции в Python
Говоря о числах, мы пройдемся по наиболее часто используемым математическим операторам, которые нужны для выполнения простых арифметических операций с числами в Python. А в разделе «Математические функции» познакомимся с функциями, которые будут очень полезны при вычислении сложных математических выражений: возведение в степень, синус/косинус, факториалы и т. д. Приступим.
Перед прочтением статьи рекомендуем открыть IDLE. По ходу чтения копируйте примеры и прогоняйте их через компилятор, чтобы на практике понять, как работает тот или иной оператор или функция.
Числа
Python есть 6 основных «математических» операторов:
- сложение;
- вычитание;
- умножение;
- деление;
- возведение в степень.
- остаток от деления (mod);
- целочисленное деление (div).
Большинство из вас должно быть знакомо со всеми вышеперечисленными операторами, кроме оператора взятия остатка от деления и целочисленного деления. Не волнуйтесь, мы поговорим об этом. Начнем с начала.
Сложение
Несложно догадаться, что делает этот оператор: он просто складывает числа. Чтобы проверить, как это работает, просто перейдите в IDLE и введите число, затем знак сложения + (плюс), а затем еще одно число, которое нужно добавить к первому числу. Нажмите Enter. Это должно выглядеть так, как показано ниже.
Пример: сложим 8 и 19.
После нажатия клавиши Enter чуть ниже строки кода появится ответ. Вывод так и будет отображаться каждый раз — чуть ниже кода. Нажимаете Enter — получаете результат.
Не останавливайтесь на этом примере, попробуйте использовать оператор сложения с другими числами. Например, попробуйте сложить числа с плавающей точкой: 4.5 + 5.5 и т. д.
У вычитания такой же синтаксис, как и у сложения. Просто измените оператор на знак вычитания — (минус). Так же выберите случайные числа и попробуйте вычесть одно из другого.
Пример: вычтем из 89.33 число 23.67. Ответ 65.55.
Умножение
Опять то же самое! Просто измените оператор на * (звездочку). Вы ведь знаете, что он используется для умножения, верно? Попробуйте использовать оператор в IDLE.
Пример: возьмите любые два числа и умножьте их с помощью оператора умножения, как показано ниже.
Деление
На этот раз нам понадобится знак / (слэш). Попробуйте использовать оператор со случайными числами.
Если вы новичок, то можете столкнуться с некоторыми трудностями. Какими? Сейчас узнаем. Для начала возьмем целые числа (числа без десятичной дроби), например 16 и 2, и разделим одно на другое.
Возведение в степень
Этого математического оператора обычно в языках программирования нет. Честно говоря, языков со встроенным возведением в степень, кроме Python, и не припомнить. В других языках для возведения в степень используют другие операторы. В Python же для этого достаточно поставить между двумя числами ** (две звездочки). Правое число возведется в степень, равную левому числу. Например, чтобы найти 10 степень числа 2, нужно написать:
Теперь мы знаем обо всех часто используемых математических операторах Python. Попробуйте объединить несколько операторов и использовать их в одном выражении. Например, введите ((2**5)*10)/3 . Python должен вывести 106.66666666666667 .
Взятие остатка от деления
Оператор взятия остатка от деления в Python обозначается % (знак процента). Если вам знакомы другие языки программирования, скорее всего, вы знаете, что такое взятие остатка от деления. В других языках этот оператор часто называют mod. Если вы с ним еще не знакомы, ничего страшного.
Вы ведь знаете оператор деления, так? Тогда вы знаете, каков будет остаток от этого деления, верно? Этот оператор как раз и возвращает этот остаток в качестве ответа. Целая часть как бы откидывается. Вот несколько примеров.
- 12%2 = 0 , так как 12 полностью делится на 2.
- 13%2 = 1 , так как остаток от деления 13 на 2 равен 1.
- 19%5 = 4 , так как, опять же, остаток от деления 19 на 5 равен 4.
В IDLE все так же:
Целочисленное деление
Этот оператор в Python обозначается знаком // (двумя слэшами), в других языках его называют div. Оператор откидывает остаток и оставляет только целую часть. Вот как это работает:
- 13//2 = 6 , так как 13/2 = 6.5
- 19//5 = 3 , так как 19/5 = 3.8
Попробуйте использовать целочисленное деление со случайными числами в своей IDLE.
Математические функции
Когда вы узнаете о Python побольше, возможно, вам захочется создать «научный калькулятор» в качестве проекта. Для этого кроме простых математических операций вам придется реализовать математические функций: тригонометрические, логарифмические и так далее. Но даже если мы забудем о создании продвинутого калькулятора, в жизни программиста достаточно ситуаций, когда вам могут понадобиться эти функции.
Например, если вы создаете ПО для инженеров-строителей — им математические функции нужны для расчета различных параметров в конструкции, которую они строят. Или, например, аэрокосмическое ПО для расчетов траектории спутника и так далее. Короче говоря, сложные математические функции используются в совершенно различных реальных программах, так что знать о них нужно.
В Python хорошие ребята уже написали код практически для всех математических функций и добавили их в библиотеки. Так что вам вручную писать функции не придется, вы можете без зазрения совести использовать готовые решения.
Подробнее о функциях в Python мы поговорим в другой статье. Здесь мы лишь немного коснемся этого вопроса.
Функция — это фрагмент кода, который принимает (или не принимает) в качестве входных данных некоторые значения, обрабатывает их, а затем возвращает (или не возвращает) некое значение в качестве выходных данных.
Как вы можете увидеть на рисунке выше, на вход функции подается x , а на выходе функция f выводит значение f(x) . В целом, функции не обязательно принимать что-то на вход или выводить что-то. Но для математической функции важно и то, и другое. Например, чтобы вычислить sin(x) обязательно нужно значение x .
В Python есть два типа функций.
- Встроенные функции — это функции, для которых не требуется никаких сторонних файлов кода (они же модули или библиотеки). Они — часть Python и генерируются в компиляторе Python, поэтому ничего импортировать для их использования не нужно.
- Пользовательские функции требуют внешних файлов, их называют модулями. Использование этих внешних файлов в вашем коде называется импортом. Все, что вам нужно сделать, чтобы использовать функции из библиотека, это импортировать их в ваш код.
Пришло время протестировать математические функции. Начнем со степенных функций!
Возведение в степень — pow(x, y)
Я знаю, о чем вы думаете. Мы же только что возводили числа в степень, так? Так. Но тогда мы возводили число в степень при помощи оператора, а это — встроенная функция. Это альтернативный способ возведения в степень.
Поскольку это встроенная функция, импортировать никаких библиотек не нужно. На вход функция pow(x, y) принимает два числа — основание и показатель степени.
Откройте IDLE и напишите:
Теперь проанализируем, что мы написали и что сделает Python. Сначала мы ввели pow — это просто имя функции, которую мы пытаемся вызвать. Это укажет компилятору Python найти встроенную функцию с именем pow и определить, что она может делать. Далее в скобках мы написали два числа через запятую: 3 и 2. Первое число — 3 — основание, а второе — 2 — показатель степень. Иначе говоря, мы пытаемся возвести 3 во вторую степень.
Как только компилятор Python убедится, что синтаксис верен, он начнет искать реализацию функции pow и выведет ответ: 9.
Теперь вы знаете, как вызывать функции. В случае с математическими функциями в общем виде это выглядит следующим образом:
Значения в скобках, разделенные запятыми, называются аргументами. В функции pow(x, y) в примере выше аргументами являлись 3 и 2. В функции может быть любое количество аргументов. У математических функций, как правило, есть как минимум один аргумент. Давайте рассмотрим другие встроенные математические функции.
Модуль — abs(x)
Функция модуля возвращает неотрицательное значение аргумента. Иначе говоря, она не меняет неотрицательные значения, а отрицательные значения делает положительными.
Пример: модуль -3 равен 3, модуль -8.74 равен 8.74 и так далее.
Синтаксис
Так как -99.99 — отрицательное число, выводом будет положительное число — 99.99.
Теперь давайте попробуем некоторые функции, для использования которых нужно импортировать библиотеку.
Синус — sin(x)
Синус — тригонометрическая функция, она принимает только одно значение в качестве аргумента — x . Аргумент должен быть выражен в радианах, не путайте со степенью. Как мы уже сказали, эту функцию не получится использовать напрямую. Если вы попытаетесь вызвать функцию sin(x), получите сообщение об ошибке.
Дело в том, что компилятор не знает, что ему делать, когда он встречает функцию sin() , поскольку мы ее не определили. Чтобы использовать ее, придется импортировать математический модуль Python, в котором в том числе есть уже реализованная функция sin() , которая поможет компилятору понять, что делать, когда он встречает эту функцию.
То, что мы сейчас сделаем, называется импортом модуля. Для этого потребуется написать такую строку:
Жмем Enter, и готово! Теперь, чтобы использовать функцию sin(), перейдите в новую строку и введите:
Поскольку 3.14159 это приблизительно π , ответ будет близок к нулю.
Как вы можете видеть, ответ такой — 2.653589335273e-6 . Он может показаться немного пугающим, но на самом деле, это всего лишь значит следующее: 2.653589335273 × 10^-6 , что равно 0.000002653589335273 . Действительно близко к нулю.
В математическом модуле есть еще ряд полезных математических функций: floor() , exp() , log() , sqrt() и многие другие. Их полный список и количество аргументов, которые они принимают на вход, можно найти на официальном сайте Python в разделе Mathematical Functions.
Проверьте, является ли число полным квадратом
Как я мог проверить, является ли число полным квадратом?
Скорость не вызывает беспокойства, на данный момент, просто работая.
7 ответов
Проблема с тем, чтобы полагаться на любые вычисления с плавающей запятой ( math.sqrt(x) , или x**0.5 ) в том, что вы не можете быть уверены в их точности (для достаточно больших целых чисел x они не будут точными, и даже могут переполниться). К счастью (если не торопиться;-) существует множество чисто целочисленных подходов, таких как следующий.
Подсказка: он основан на «вавилонском алгоритме» для квадратного корня, смотрите википедию. Он работает для любого положительного числа, для которого у вас достаточно памяти для завершения вычислений;-).
Edit: давайте посмотрим пример.
это печатает, как надо (и за разумное время тоже;-):
Пожалуйста, прежде чем предлагать решения, основанные на промежуточных результатах с плавающей запятой, убедитесь, что они работают правильно на этом простом примере — это не так сложно (вам просто нужно несколько дополнительных проверок на случай, если вычисленный sqrt будет немного не таким), просто нужно немного внимательности.
А затем попробуйте с x**7 и найдите умный способ обойти проблему, которую вы получите,
вам придется становиться все умнее и умнее по мере роста чисел, конечно.
Если бы я спешил, конечно, я бы использовал gmpy — но тогда, я явно предвзят;-).
Да, я знаю, это настолько просто, что кажется жульничеством (немного похоже на то, как я отношусь к Python в целом;-) — никакой заумности, только идеальная прямота и простота (и, в случае с gmpy, чистая скорость;-)).