Добавить в корзинуПозвонить
Найти в Дзене

Решение задач JavaScript на LeetCode | Возведение в степень вручную | Pow(x, n) | Часть 6

Всем привет. Сегодня мы будем решать вот такую задачу. Нужно написать функцию, которая будет возводить выбранное значение в степень. Нужно написать это вручную без использования Math.pow(). Эта задача меня очень сильно заинтересовала. У этой задачи довольно низкий уровень решаемости, 38.5%. Так, будет интересно... Начинаем... Для начала сделаем код, который считает обычные степени. Я имею ввиду степени, которые являются целыми и неотрицательными числами. Сразу напишем, если степень 0, то наше число превратится в 1. Создаём условия для целого положительного числа Чтобы возвести число в такую степень, его достаточно умножить на себя n раз. Запускаем код и смотрим. Этот код работает на 2 случаях из трёх, где степень это целое положительное число Теперь нам нужно сделать код, считающий отрицательные степени. Чтобы посчитать отрицательную степень, нужно поделить 1 на это самое число, но только в положительной степени. Это для тех, кто не знает Реализуем это в виде кода Теперь наш код запус
Оглавление

Всем привет. Сегодня мы будем решать вот такую задачу. Нужно написать функцию, которая будет возводить выбранное значение в степень. Нужно написать это вручную без использования Math.pow(). Эта задача меня очень сильно заинтересовала.

У этой задачи довольно низкий уровень решаемости, 38.5%. Так, будет интересно... Начинаем...

-2

Начинаем делать задачу

Для начала сделаем код, который считает обычные степени. Я имею ввиду степени, которые являются целыми и неотрицательными числами.

Сразу напишем, если степень 0, то наше число превратится в 1. Создаём условия для целого положительного числа

-3

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

-4

Запускаем код и смотрим. Этот код работает на 2 случаях из трёх, где степень это целое положительное число

-5

Теперь нам нужно сделать код, считающий отрицательные степени.

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

-6

Реализуем это в виде кода

-7

Теперь наш код запускается на трёх примерах

-8

У нас есть три примера. Я ожидал, что у нас ещё будут и дробные степени, их вычислять сложнее. В примерах этого я не вижу, посмотрим, что будет после запуска нашего кода на более большом количестве данных

-9
-10

И после запуска кода, я получил вот это

-11

Я ожидал, что мы будем считать более сложные степени, такие как 3/2, но здесь мы считаем целочисленные степени, и главная сложность в том, что они бывают слишком большими.

Если вам интересно, как считаются такие степени, как 3/2, я немного отклонюсь от темы и вкратце вам напишу. Если не интересно, можете заголовок пролистать.

Как считать дробные степени

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

Более понятно, возможно, вам будет на примере.

-12

Например, у нас есть число 16 в степени 3/4. Мы берём число и получаем из него корень 4-ой степени. А какое число нужно умножить на себя 4 раза, чтобы получить 16? Правильно, 2. Потом мы берём 2 и возводим в степень 3, и получаем 8.

Если что, у обычного корня степень 2. Например, 64 в корне можно записать, как 64 в степени 1/2 или в степени 0,5. Это будет 8.

-13

Продолжаем...

Продолжаем решать задачку дальше

Вернёмся, а что же у нас здесь?

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

-14
-15

А вот здесь не совсем понятно, что делать...

-16

Давайте подумаем логически, что происходит с числом, когда оно возводится в слишком большую отрицательную степень? Число в отрицательной степени это единица, которая делится на это самое число в неотрицательной степени.

-17

Если возвести число в большую степень, например, если возвести 2 хотя бы в степень -16, то получится довольно маленькое число

-18

После какого-то момента число становится слишком маленьким, оно почти становится равным нулю. Я думаю, что LeetCode должен как-то округлять все эти числа, чтобы у числа не было слишком много знаков, после запятой. У меня есть предположение, что после какого-то момента, число в слишком большой степени можно обозначить, как число равное нулю. Можно будет просто остановить цикл и вывести ноль. Давайте же это проверим...

Стоп... Я тут же сразу понял, что числа бывают больше единицы, а бывают меньше. Если число, которое меньше единицы, но больше нуля, например, 0.5 взять в очень большую отрицательную степень, оно станет наоборот, слишком большим.

-19

А если это вообще будут отрицательные числа? Тогда они вообще будут менять знак, в зависимости от чётности степени. Но всё равно, если слишком сильно уменьшать степень, например, до -10000000, то и само число будет стремиться к нолю, например, число 0,000000001, а может получиться -0,000000001, в зависимости от степени.

-20

Но я думаю, нужна ли нам такая точность в значениях? Может LeetCode требует число с точностью до 4 знаков, после запятой? И какая-нибудь 0,000001 превратиться в 0,0000, даже отрицательная.

Пробуем.

-21

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

-22

Здесь нам повезло, у нас -1 в большой степени, но всё равно нужно сделать условие, которое это быстренько посчитает.

-23

Да, это работает!!

-24

И я попал в 2% худших 😀. На LeetCode у нас такая интересная задачка, в коде нельзя использовать pow(x, n), и нужно считать вручную. Перед началом решения этой задачи, я просто в коде написал pow(x, n) и попал на первое место по скорости.

Эту задачку можно было бы оптимизировать, но я не хочу 😁

Ну а вы подписывайтесь на канал, ставьте лайки и пишите комментарии, если есть какие-то интересные дополнения