TGViewer
Algorithmics: хакаем алгоритмические собесы Algorithmics: хакаем алгоритмические собесы @algorithmics_cl · 1.45K subscribers
Post #31 636
Возведение числа в степень. Имплементация функции pow(x, n)

Иногда, на алгоритмических секциях могут попросить реализовать какую-нибудь стандартную функцию любого языка, не используя встроенные функции. Например, это может быть функция сортировки массива, или, как в данном случае — функция возведения числа в степень. На leetcode эта задача помечена как medium, хотя, на мой взгляд, ничего сложного в ней нет. Во всяком случае в такой формулировке и с такими ограничениями.

Сложность: 🟠 Cредняя

ℹ️ Описание

Имплементируйте функцию возведения числа x в степень n — pow(x, n).

⚠️ Ограничения

🔹Число x в диапазоне [-100.0, 100.0]
🔹Степень n в диапазоне [-2^31, (2^31) - 1]
🔹n - целое число
🔹Если x == 0, то n > 0
🔹Итоговый результат в диапазоне [-10000, 10000]


1️⃣ Пример

Входящие данные: x=2.00, n=10
Ответ: 1024

2️⃣ Пример

Входящие данные: x=2.10, n=3
Ответ: 9.261

3️⃣ Пример

Входящие данные: x=2.00, n=-2
Ответ: 0.25


✅ Решение

Для того, чтобы получить опимальное решение нужно:

- Вспомнить что такое рекурсивные функции и как с ними работать
- Свойство степеней: x^n = (x*x)^(n/2)
- Свойство степеней: x^(-n) = 1/ x^n

Алгоритм рекурсивной функции powAbsN(x, |n|).
|n| - модуль числа, то есть без учета знака.

Кейсы с отрицательной степенью обработаем отдельно, поделив 1 на pow(x, |n|):

🔘 Если n == 0, возвращаем 1 (x^0 всегда равен 1)

🔘 Если n == 1, возвращаем x

🔘 Если n четное число, возвращаем результат рекурсивного вызова функции, передав в качестве аргумента x квадрат от текущего значения x (x*x), а в качестве n - результат деления без остатка текущего значения n (n/2) - 2^4 = (2*2)^(4/2) = 4^2

🔘 Если n нечетное число, возвращаем результат рекурсивного вызова функции (также передав в качестве аргумента x квадрат от текущего значения x (x*x), а в качестве n - результат деления без остатка текущего значения n (n/2)) умноженый на текущее значение x - 2^5 = (2^4)*2 = (4^2)*2


Алгоритм основной функции myPow(x, n):

🔘 Если x == 1, возвращаем 1 (1 в любой степени равна 1)

🔘 Если x == -1, возвращаем -1 при нечетном n и 1 при четном n

🔘 Если n >= 0, возвращаем результат функции powAbsN(x, |n|)

🔘 Если n < 0, возвращаем 1/powAbsN(x, |n|)

Посмотреть реализацию

🅾️ Оценка сложности

По времени
Благодаря свойству степеней: x^n = (x*x)^(n/2), вместо n умножений числа x, на каждой итерации рекурсии мы сокращаем количество умножений в два раза. То есть сложность — O(log(n))


По памяти
Доп память константна — O(1)

#float #medium
algorithmics-blog.github.io Имплементация функции возведения в степень Подробный разбор решения задачи с примерами на языках TypeScript и GO
  • 👍 4
More from @algorithmics_cl
  1. Feb 8, 2025Количество провинций Давайте закрепим знания про Disjoint Set новой задачей. Сложность: 🟡…
  2. Feb 4, 2025Disjoint Set Привет, друзья! Сегодня мы с вами не будем решать конкретную задачу, а познак…
  3. Dec 4, 2024Так как в этой задаче баланс между операциями записи и чтения смещен в сторону записи, нам…
  4. Dec 4, 2024Система поиска подсказок Ранее мы уже разбирали задачу, в которой нужно было реализовать с…
  5. Oct 29, 2024Префиксное дерево (Trie) Префиксное дерево, или Trie (произносится как «три») — это структ…
  6. Oct 11, 2024Максимальная сумма парных элементов связного списка Продолжаем изучение связанных списков…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →