Разбор задачи: Квадратный корень

Предложенный нами код решения:

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, округленного вниз до ближайшего целого числа. Решение основано на методе бинарного поиска, что делает его эффективным и подходящим для работы с большими числами.


Пошаговый разбор кода

  1. Инициализация границ поиска:

    left, right = 0, x
    • left и right задают диапазон возможных значений квадратного корня.
    • Диапазон начинается от 0 и заканчивается самим числом xxx, так как x≤x\sqrt{x} \leq xx​≤x для любого x≥0x \geq 0x≥0.
  2. Цикл бинарного поиска:

    python

    Копировать код

    while left <= right:
    • Пока диапазон поиска не исчерпан (граница left не пересеклась с right), продолжаем поиск.
  3. Нахождение середины диапазона:

    mid = (left + right) // 2
    • Середина диапазона вычисляется с округлением вниз.
    • mid — это текущее предположение для квадратного корня.
  4. Проверка значения mid:

    if mid * mid == x:
        return mid
    • Если квадрат текущего предположения равен xxx, мы нашли точный квадратный корень, и функция сразу возвращает результат.
  5. Сужение диапазона:

    elif mid * mid < x:
        left = mid + 1
    else:
        right = mid - 1
    • Если квадрат текущего числа меньше xxx, то настоящий квадратный корень находится справа от mid. Увеличиваем нижнюю границу: left = mid + 1.
    • Если квадрат текущего числа больше xxx, то квадратный корень находится слева. Уменьшаем верхнюю границу: right = mid - 1.
  6. Возврат результата:

    return right
    • После завершения цикла, right содержит округленный вниз квадратный корень числа xxx.

Пример работы функции

Пример 1: x=4x = 4x=4

  • Границы: left = 0, right = 4.
  • Итерации:
    1. mid = 2, 22=42^2 = 422=4. Результат найден: возвращаем 2.

Пример 2: x=8x = 8x=8

  • Границы: left = 0, right = 8.
  • Итерации:
    1. mid = 4, 42=164^2 = 1642=16. Уменьшаем верхнюю границу: right = 3.
    2. mid = 1, 12=11^2 = 112=1. Увеличиваем нижнюю границу: left = 2.
    3. mid = 2, 22=42^2 = 422=4. Увеличиваем нижнюю границу: left = 3.
    4. Цикл завершается, возвращаем right = 2.

 



Комментарии

DeaglenS_avatar
DeaglenS
,
6 месяцев, 16 дней назад

Я сделал так, но это, видимо, не честно 😁

import math
def my_sqrt(x):
 return math.floor(math.sqrt(x))
   

1
admin_avatar
admin
,
6 месяцев, 14 дней назад

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

0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии