Программа курса:
Разбор задачи: Квадратный корень
Предложенный нами код решения:
def my_sqrt(x):
"""
Возвращает квадратный корень из x, округленный вниз до ближайшего целого числа.
"""
# Инициализация границ для бинарного поиска
left, right = 0, x
while left <= right:
# Находим середину
mid = (left + right) // 2
# Проверяем квадрат текущего числа
if mid * mid == x:
return mid
elif mid * mid < x:
left = mid + 1
else:
right = mid - 1
# Возвращаем округленный вниз квадратный корень
return rightФункция my_sqrt реализует нахождение квадратного корня числа xxx, округленного вниз до ближайшего целого числа. Решение основано на методе бинарного поиска, что делает его эффективным и подходящим для работы с большими числами.
Пошаговый разбор кода
Инициализация границ поиска:
left, right = 0, xleftиrightзадают диапазон возможных значений квадратного корня.- Диапазон начинается от 0 и заканчивается самим числом xxx, так как x≤x\sqrt{x} \leq xx≤x для любого x≥0x \geq 0x≥0.
Цикл бинарного поиска:
python
Копировать код
while left <= right:- Пока диапазон поиска не исчерпан (граница
leftне пересеклась сright), продолжаем поиск.
- Пока диапазон поиска не исчерпан (граница
Нахождение середины диапазона:
mid = (left + right) // 2- Середина диапазона вычисляется с округлением вниз.
mid— это текущее предположение для квадратного корня.
Проверка значения
mid:if mid * mid == x: return mid- Если квадрат текущего предположения равен xxx, мы нашли точный квадратный корень, и функция сразу возвращает результат.
Сужение диапазона:
elif mid * mid < x: left = mid + 1 else: right = mid - 1- Если квадрат текущего числа меньше xxx, то настоящий квадратный корень находится справа от
mid. Увеличиваем нижнюю границу:left = mid + 1. - Если квадрат текущего числа больше xxx, то квадратный корень находится слева. Уменьшаем верхнюю границу:
right = mid - 1.
- Если квадрат текущего числа меньше xxx, то настоящий квадратный корень находится справа от
Возврат результата:
return right- После завершения цикла,
rightсодержит округленный вниз квадратный корень числа xxx.
- После завершения цикла,
Пример работы функции
Пример 1: x=4x = 4x=4
- Границы:
left = 0,right = 4. - Итерации:
mid = 2, 22=42^2 = 422=4. Результат найден: возвращаем 2.
Пример 2: x=8x = 8x=8
- Границы:
left = 0,right = 8. - Итерации:
mid = 4, 42=164^2 = 1642=16. Уменьшаем верхнюю границу:right = 3.mid = 1, 12=11^2 = 112=1. Увеличиваем нижнюю границу:left = 2.mid = 2, 22=42^2 = 422=4. Увеличиваем нижнюю границу:left = 3.- Цикл завершается, возвращаем
right = 2.
DeaglenS
,Я сделал так, но это, видимо, не честно 😁
import math
def my_sqrt(x):
return math.floor(math.sqrt(x))
admin
,DeaglenS, Очень даже честно, пайтон создан как раз для таких вещей, главное чтоб вы имели у себя в голове все эти модули для более быстрой работы.