Переходим дорогу вслепую

  • 3
  • Недоступна
Допустим, мы точно знаем, что в начале каждого часа на нашем светофоре в течение 3 минут горит зелёный, потом минуту — жёлтый, и ещё минуту — красный свет, а затем всё повторяется. Наша программа должна определить, какой свет горит сейчас («сейчас» — это некое вещественное число, определяющееся временем в минутах, прошедших с начала очередного часа).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (332)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Sergio4 уровень, Харьков
12 часов назад
Вопрос один: почему float не канает? С double решение было принято. Почитал комменты, не тоько у меня башка взрывалась из-за этого условия. Для данной задачи float за глаза хватит. А сдругой стороны это и плюс, пока решал, сделал три варианта решения.
Антон5 уровень, Санкт-Петербург
среда, 19:08
Более короткий перевод из double в int без объявления новых переменных
int n = (int) Double.parseDouble(reader.readLine());
Далее два условия с делением без остатка (n % 5)
Артем Сычев4 уровень
среда, 13:18
Как же потрепала мне нервы эта задача, попробовал три варианта решения каждое из которых верно. в итоге подошло самое лаконичное)))
Boyko Igor Stepanovich7 уровень, Львов
среда, 05:22
цикл for поки t>5. t=t-5; А потім перевіряєм діапазони
Валентин7 уровень, Кинель
10 июля, 09:20
Тоже из-за double споткнулся. Хотя все работало.
Дмитрий6 уровень, Минск
10 июля, 08:42
Фух с 6 попытки. Логику построил изначально правильную через остаток от деления, но косякнул с интервалами. Нормально мозг покипел.
Konstantin Kulinich7 уровень, Киев
4 июля, 19:51
использовал do...while ... и + конечно же условные операторы :) Зациклил навечно программу в main чтобы по сто раз не запускать. Перед сдачей забыл снять вечный цикл с main, поэтому сдал со второй попытки. Удачи.
Станислав6 уровень, Москва
24 июня, 09:41
очень удобно выделить остаток через оператор "%", для примера "a = b%5", а остальное уже через метод if, else if...
Vladimir5 уровень, Москва
23 июня, 15:50
С float не проходит проверку, используйте double
Sergei8 уровень, Минск
3 июля, 09:21
спасибо! я голову сломал - работает правильно, а проверку не проходит
Алексей 6 уровень, Москва
21 июня, 13:24
Решил задачу, сам накопал перевод String в Double double t = Double.parseDouble(a); (для тех, кто не знал). Не понимаю только, почему главное решение отталкивается именно от остатка деления на 5? Объясните доступно кто может. Благодарю!
алексей 10 уровень, Минск
23 июня, 19:48
у тебя цикл работы светофора от зеленого до следующего зеленого равен 5 минутам, 3 минуты горит зеленый , 1 минуту горит желтый и 1 минуту горит красный в итоге 5 минут , дальше загорается опять зеленый, каждой минуте в этом цикле можно присвоить значение так как 3 минуты у тебя горит зеленый значит каждой минуте из трех присваиваешь "зеленый" , 4 минуте присваиваешь "желтый ", пятой минуте "красный" , соответственно тебе нужно узнать сколько прошло циклов с начального момента времени, к примеру ты хочешь узнать какой сигнал горит на 121 минуте , делишь 121/5 = 30.2 , значит прошло полных циклов 30 , и еще 0.2 , вот тут то и начинаются пляски с бубном , что бы понять какой минуте из пятиминутного цикла соответствует 0.2 , но это я описал теорию общую как я сообразил, я решил не через остаток от деления , видимо , мой путь сложнее)), через проценты не додумался , буду пробовать , но вот мой код : Scanner scanner = new Scanner(System.in); double t = scanner.nextDouble(); int a = (int) (t / 5); int e = (int)t; int d = e - a * 5; switch (d){ case 0: case 1: case 5: case 2: System.out.println("зелёный"); break; case 3: System.out.println("жёлтый"); break; case 4: System.out.println("красный"); break;
Алексей 6 уровень, Москва
24 июня, 08:37
Алексей, благодарю, теперь логика деления на 5 понятна.
ALex V. Mel7 уровень
1 июля, 13:30
а 121/5 не 24.2 ?
алексей 10 уровень, Минск
2 июля, 14:29
ну извините,извините , ошибся, суть от этого не меняется
ALex V. Mel7 уровень
2 июля, 15:12
Я не с претензиями, а так на всякий случай, вдруг я чего-то не разглядел и это какое-то "свойство" алгоритма. А так-то решение вроде неплохое , я решил менее оптимальным способом. У меня отдельная функция возвращающая цвет, а в main деление на 10, и остаток от деления на 10 в зависимости от считанного числа. Ваш вариант выглядит гораздо компактнее, за исключением того что здесь не показано как учитывается и учитывается ли вообще дробная часть времени. Кстати интересно у нас разные уровни, а задача та же. Как это работает? Или Вы её решали уже на том же уровне что и я?
алексей 10 уровень, Минск
2 июля, 18:57
да, здесь показывает не тот уровень на котором ты был когда решал, а текущий
алексей 10 уровень, Минск
2 июля, 19:02
здесь у меня хитро сделано , оно дробную часть отбрасывает , но все равно все учитывается, программа работает как нужно , но если решать исключительно через остаток от деления получается проще
Дмитрий4 уровень, Днепр
4 июля, 14:24
Объясни пожалуйста, все для тупых...
int a = (int) (t / 5);
ты разделил, чтобы получить количество циклов, тут вроде понятно. А здесь
int d = e - a * 5;
объясни эту строку, а то я не понимаю? Хочу понять.
Анатолий Горелых5 уровень, Самара
6 июля, 21:04
Получает текущую минуту от начала часа.
алексей 10 уровень, Минск
8 июля, 12:01
мне кажется , что ты не понимаешь , что такое е и откуда оно взялось , здесь е -это целая часть от t , так как ты можешь к примеру ввести c клавиатуры не t=13 , а t=13.2 минуты , а нам нужно оперировать целыми числами , а эта часть дробная нам в принципе не важна
Дмитрий4 уровень, Днепр
четверг, 09:04
Дааа, точняк затупил... :/ Спасибо