← Назад к вопросам
Угол между стрелками часов
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°