← Назад к вопросам

Угол между стрелками часов

1.7 Middle🔥 111 комментариев
#Python Core

Условие

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

Пример

clock_angle(12, 30) → 165.0 clock_angle(3, 0) → 90.0 clock_angle(9, 0) → 270.0 или 90.0 (меньший угол)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Угол между стрелками часов

Описание

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

Решение 1: Базовое решение

def clock_angle(hours, minutes):
    """Вычисляет угол между часовой и минутной стрелками."""
    # Вычисляем угол минутной стрелки (6 градусов в минуту)
    minute_angle = minutes * 6
    
    # Вычисляем угол часовой стрелки (30 градусов в час + 0.5 градуса в минуту)
    # Часовая стрелка также движется в зависимости от минут
    hour_angle = (hours % 12) * 30 + minutes * 0.5
    
    # Вычисляем разницу
    angle = abs(hour_angle - minute_angle)
    
    # Возвращаем меньший угол (360 - угол, если угол > 180)
    return min(angle, 360 - angle)

print(clock_angle(12, 30))  # 165.0
print(clock_angle(3, 0))    # 90.0
print(clock_angle(9, 0))    # 90.0
print(clock_angle(6, 0))    # 180.0
print(clock_angle(3, 15))   # 7.5

Временная сложность: O(1) Пространственная сложность: O(1)

Решение 2: С добавлением валидации

def clock_angle(hours: int, minutes: int) -> float:
    """Вычисляет угол между стрелками с валидацией."""
    # Валидация входных данных
    if not (0 <= hours < 24 and 0 <= minutes < 60):
        raise ValueError("Часы должны быть от 0 до 23, минуты от 0 до 59")
    
    # Переводим в 12-часовой формат
    hours = hours % 12
    
    # Угол минутной стрелки (6 градусов в минуту: 360 / 60 = 6)
    minute_angle = minutes * 6
    
    # Угол часовой стрелки
    # 30 градусов в час (360 / 12 = 30) + 0.5 градуса в минуту (30 / 60 = 0.5)
    hour_angle = hours * 30 + minutes * 0.5
    
    # Абсолютная разница между углами
    angle = abs(hour_angle - minute_angle)
    
    # Возвращаем меньший угол
    return min(angle, 360 - angle)

Решение 3: С детальным объяснением

def clock_angle(hours: int, minutes: int) -> float:
    """Вычисляет угол между стрелками часов.
    
    Ключевые моменты:
    - Полный оборот = 360 градусов
    - 12 часов на циферблате
    - 60 минут на циферблате
    - Минутная стрелка: 360 / 60 = 6 градусов в минуту
    - Часовая стрелка: 360 / 12 = 30 градусов в час
    - Часовая стрелка также движется: 30 / 60 = 0.5 градуса в минуту
    """
    # Переводим в 12-часовой формат
    hours = hours % 12
    
    # Вычисляем угол минутной стрелки
    # Минутная стрелка указывает прямо вверх в 0 минут
    minute_angle = minutes * 6
    
    # Вычисляем угол часовой стрелки
    # Часовая стрелка указывает на 12 в 0:00, и движется плавно
    hour_angle = hours * 30 + minutes * 0.5
    
    # Вычисляем абсолютную разницу
    angle = abs(hour_angle - minute_angle)
    
    # Возвращаем меньший из двух возможных углов
    # (угол и 360 - угол)
    return min(angle, 360 - angle)

Решение 4: Возвращает оба угла

def clock_angles_both(hours: int, minutes: int) -> tuple:
    """Возвращает оба угла между стрелками."""
    hours = hours % 12
    
    minute_angle = minutes * 6
    hour_angle = hours * 30 + minutes * 0.5
    
    angle = abs(hour_angle - minute_angle)
    
    # Возвращаем оба угла (меньший и больший)
    smaller = min(angle, 360 - angle)
    larger = max(angle, 360 - angle)
    
    return (smaller, larger)

print(clock_angles_both(3, 0))     # (90.0, 270.0)
print(clock_angles_both(9, 0))     # (90.0, 270.0)
print(clock_angles_both(12, 30))   # (165.0, 195.0)

Решение 5: С использованием decimal для точности

from decimal import Decimal, ROUND_HALF_UP

def clock_angle_precise(hours: int, minutes: int) -> Decimal:
    """Вычисляет угол с высокой точностью."""
    hours = Decimal(hours % 12)
    minutes = Decimal(minutes)
    
    minute_angle = minutes * Decimal('6')
    hour_angle = hours * Decimal('30') + minutes * Decimal('0.5')
    
    angle = abs(hour_angle - minute_angle)
    
    result = min(angle, Decimal('360') - angle)
    
    return result.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)

Решение 6: С визуализацией

def clock_angle_visual(hours: int, minutes: int) -> dict:
    """Возвращает детальную информацию об углах."""
    hours = hours % 12
    
    minute_angle = minutes * 6
    hour_angle = hours * 30 + minutes * 0.5
    
    angle = abs(hour_angle - minute_angle)
    smaller_angle = min(angle, 360 - angle)
    
    return {
        'time': f"{hours:02d}:{minutes:02d}",
        'minute_hand_angle': minute_angle,
        'hour_hand_angle': hour_angle,
        'raw_difference': angle,
        'smaller_angle': smaller_angle,
        'larger_angle': 360 - smaller_angle
    }

info = clock_angle_visual(3, 15)
for key, value in info.items():
    print(f"{key}: {value}")

Тестирование

def test_clock_angle():
    assert clock_angle(3, 0) == 90.0
    assert clock_angle(9, 0) == 90.0
    assert clock_angle(12, 30) == 165.0
    assert clock_angle(6, 0) == 180.0
    assert clock_angle(12, 0) == 0.0
    assert clock_angle(3, 15) == 7.5
    assert clock_angle(15, 0) == 90.0  # 3:00 в 24-часовом формате
    assert clock_angle(0, 0) == 0.0    # Полночь
    print("Все тесты пройдены!")

test_clock_angle()

Рекомендуемое решение для интервью

def clock_angle(hours: int, minutes: int) -> float:
    """Вычисляет угол между часовой и минутной стрелками.
    
    Args:
        hours: часы (0-23)
        minutes: минуты (0-59)
    
    Returns:
        Меньший угол между стрелками в градусах
    
    Временная сложность: O(1)
    Пространственная сложность: O(1)
    """
    # Переводим в 12-часовой формат
    hours = hours % 12
    
    # Угол минутной стрелки (6 градусов в минуту)
    minute_angle = minutes * 6
    
    # Угол часовой стрелки (30 градусов в час + 0.5 градуса в минуту)
    hour_angle = hours * 30 + minutes * 0.5
    
    # Абсолютная разница
    angle = abs(hour_angle - minute_angle)
    
    # Возвращаем меньший угол
    return min(angle, 360 - angle)

Объяснение ключевых концепций

Движение минутной стрелки:

  • За 60 минут полный оборот (360°)
  • За 1 минуту: 360° / 60 = 6°

Движение часовой стрелки:

  • За 12 часов полный оборот (360°)
  • За 1 час: 360° / 12 = 30°
  • За 1 минуту: 30° / 60 = 0.5°

Пример: 3:15

  • Минутная стрелка: 15 × 6 = 90° (указывает на 3)
  • Часовая стрелка: 3 × 30 + 15 × 0.5 = 90 + 7.5 = 97.5° (между 3 и 4)
  • Угол: |97.5 - 90| = 7.5°