Найти угол между стрелками часов - C (СИ)
Формулировка задачи:
Условие:
Я попробовал что-то написать:
Однако программа проходит все тесты, кроме одного
Где ошибка?
Ограничение времени: 1 с
Ограничение памяти: 1 M
На стандартном потоке ввода задается время (в двадцатичетырехчасовом формате) в виде двух целых чисел: часов и минут. Часовая стрелка перемещается по циферблату непрерывно, то есть в 14:00 она находится ровно на делении 2, а в 14:30 находится посередине между делениями 2 и 3. Определите и напечатайте на стандартный поток вывода угол (в градусах) от часовой стрелки до минутной. Угол должен быть в интервале [-180;180), положительным направлением вращения часовой стрелки считается направление по часовой стрелке.
Для вывода ответа используйте спецификацию преобразования %.10f. Ваш ответ будет сравниваться с правильным ответом как числа с плавающей точкой с точностью 1e-5.
Примеры
Входные данные Результат работы
14 0 | -60.0000000000
14 30 | 105.0000000000
Язык: gcc - GNU C 4.9.1
#include <stdio.h>
#include <math.h>
int main(void) {
double h, m, angle;
if ( scanf("%lf %lf", &h, &m) > 0 ) {
if (h >= 12)
h -= 12;
angle = fabs(30*(h + m/60) - 6*m);
if (angle > 180)
angle = 360 - angle;
if (5*(h + m/60) > m)
angle *= -1;
printf("%.10f", angle);
}
return 0;
}Решение задачи: «Найти угол между стрелками часов»
textual
Листинг программы
int main(void)
{
double h, m, angle;
if ( scanf("%lf %lf", &h, &m) > 0 )
{
if(h>=12) h-=12;
angle = 6*m - 30*(h + m/60);
if (angle > 180) angle-=360;
if (angle < -180) angle+=360;
printf("%.10f", angle);
}
return 0;
}
Объяснение кода листинга программы
- Ввод значений времени в переменные h и m с помощью функции scanf.
- Если ввод корректен, то выполняется блок кода.
- Переменная h приводится к диапазону от 0 до 11 (12 часов вычитаются из значения).
- Вычисляется значение переменной angle как 6 умножить на значение переменной m, делённое на 60, и вычитается 30, умноженное на сумму значения переменной h и m делённое на 60.
- Если значение переменной angle больше 180, то оно вычитается из 360.
- Если значение переменной angle меньше -180, то оно прибавляется к 360.
- Выводится значение переменной angle с точностью до 10 знаков после запятой.
- Если ввод некорректен, то программа завершается и возвращается 0.