Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4

Интересная задача про часы

27.12.2019, 22:02. Показов 2630. Ответов 4
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите определить время, которое покажут часы, после того, как они K раз окажутся на одной прямой. Ввести h, m, K; Нашёл скорость сближения и время. Но на большом K, тип данных double начинает терять значения

Добавлено через 4 часа 1 минуту
Вот примерный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
int main() {
    int K, n = 0;
    cin >> K;
 
    double m, h;
    double m1 = 0, h1 = 0;
 
    cin >> h; cin.get(); cin >> m;
 
    double v1 = 0.5, v2 = 6;
    double v3 = 5.5;
    double t3 = 32.727272727272727;
    double m2;
    double gr1 = h * 30, gr2 = m * 6;
 
    gr1 = gr1 + (m / 2);
    if (gr1 == 360) { gr1 = 0; }
    if (gr2 == 360) { gr2 = 0; }
    if (gr1 == gr2 or gr1 + 180 == gr2 or gr2 + 180 == gr1) { m2 = t3; }
    else {
 
        if (gr1 > gr2) {
            if (gr1 - gr2 > 180) { m2 = (gr1 - gr2 - 180) / v3; }
            if (gr1 - gr2 < 180) { m2 = (gr1 - gr2) / v3; }
        }
 
        if (gr1 < gr2) {
            if (gr2 - gr1 > 180) { m2 = (360 - gr2 + gr1) / v3; }
            if (gr2 - gr1 < 180) { m2 = (180 - gr2 + gr1) / v3; }
        }
    }
 
    m1 = m2 + (K - 1) * t3;
 
 
    if (m1 > 60) { h1 = m1 / 60;h1 = floor(h1); }
    double m3;
    m3 = round(m1); 
    unsigned int m4 = m3;
    m4 = m4 % 60;
    cout << fixed << setprecision(0);
 
        cout << h1 << " " << m4 << endl;
    
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2019, 22:02
Ответы с готовыми решениями:

Интересная задача
https://informatics.mccme.ru/moodle/mod/statements/view.php?chapterid=113321#1 если честно идей может кто то поможет

Интересная задача на графы
Помогите решить. Никак не могу придумать способ. Мне говорят, что на графы, а связать это с графами не могу. Может хоть способ решения и...

Задача интересная, но не могу разобраться
Задача: Однажды трое лучших друзей Петя, Вася и Тоня решили создать команду и участвовать в соревновании по программированию. Обычно на...

4
place status here
 Аватар для gunslinger
3187 / 2221 / 640
Регистрация: 20.07.2013
Сообщений: 6,017
28.12.2019, 07:16
Конечно же, (уверен) можно гораздо проще, но у меня так получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// костанты
// h_shift_per_hour -
// на сколько (минутных) делений циферблата сдвигается часовая стрелка за 1 час
// scale_between_m_and_h_moving -
// во сколько раз больше минутных делений проходит минутная стрелка больше часовой за 1 час
const h_shift_per_hour = 5, scale_between_m_and_h_moving = 12;
//---------------------------------------------------------------------------
// (вспомогательная) функция увеличения часов h на 1
unsigned int h_inc (unsigned int h)
{
  h++;  //  увеличиваем на 1
  if (h % 12 == 11)  // если получаем 11 или 23 часа
    h++;             // то прибавляем еще 1
  if (h == 24)  // 24 часа считаем как 0 часов
    h = 0;
  return h;
}
//---------------------------------------------------------------------------
// (вспомогательная) функция h_pos - позиция часовой стрелки в зависимости от указанного времени (h и m)
double h_pos (unsigned int h, unsigned int m)
{
  double hpos = h % scale_between_m_and_h_moving * h_shift_per_hour + 1. * m / scale_between_m_and_h_moving;
  hpos = RoundTo(hpos, 0);  // округляем до ближайшего целого
  return hpos;
}
//---------------------------------------------------------------------------
// основная функция
double new_time (unsigned int h, unsigned int m, unsigned long long k)
{
  // hpos - позиция часовой стрелки в зависимости от указанного времени (h и m)
  double hpos = h_pos(h, m);
 
  // h_m_position - индикатор того, где находятся минутная и часовая стрелки относительно друг друга
  // -1 - минутная стрелка позади, 0 - позиции совпадают, 1 - минутная стрелка впереди
  int h_m_position = ((m < hpos) ? -1 : (m == hpos ? 0 : 1));
 
  // если минутная стрелка впереди, то прибавляем 1 час (до следующего совпадения)
  if (h_m_position == 1)
    h = h_inc(h);
  // если минутная стрелка позади, убавляем 1 час и снова прибавляем для выравнивания (до совпадения)
  else if (h_m_position == -1)
    h = h_inc(h - 1);
 
  // теперь нам нужно получить на одно совпадение меньше
  k--;
  // каждые 22 совпадения время повторяется, поэтому "откидываем лишние совпадения"
  k %= 22;
 
  while (k > 0)  // пока остаются совпадения k
  {
    h = h_inc(h);  // наращиваем h
    k--;  // и уменьшаем k
  }
 
  // определяем предварительное положение минутной стрелки
  m = h % scale_between_m_and_h_moving * h_shift_per_hour;
  // определяем предварительное положение часовой стрелки
  hpos = h_pos(h, m);
 
  while (hpos != m)  // пока стрелки не совпадают
  {
    m++;  // увеличиваем m на 1
    hpos = h_pos(h, m);  // пересчитываем положение часовой стрелки
  }
 
  return h + hpos / 100.;  // получаем время
}
Например, при вызове функции
C++
1
new_time(5, 21, 147);
получим: 20,44 (вывод в виде числа)
Что означает следующее: при начальном времени 5 ч 21 мин и требовании совпасть стрелкам 147 раз это произойдет в момент времени, когда будет 20 ч 44 мин.
Вывод результата также не доработан в следующем: если время окажется равным 12 ч 00 мин или 00 ч 00 мин, то будет выведено 12 или 0 (без минут, так как они равны 0).
1
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,061
Записей в блоге: 3
28.12.2019, 14:57
Цитата Сообщение от gunslinger Посмотреть сообщение
когда будет 20 ч 44 мин.
не сошлось c моим,
у меня утро 8:40
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{   
    int k = 147;
    int h = 5  ;
    int m = 21 ;
 
    std::cout << "h = " << (h + k)%24     << "\n"
              << "m = " << (h + k)%12 * 5 << "\n";
}
Добавлено через 12 минут
более совершенная:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void foo(int h, int m, int k)
{   int kk = k;
    if(m < ((h%12)*5)) k--;
    std::cout << ">>> k(" << kk  << "), h:m[ " << h << " : "<< m << " ]\n"
              << "    h     = " << (h + k)%24     << "\n"
              << "    m     = " << (h + k)%12 * 5 << "\n\n";
}
 
int main()
{   
    foo(5,  10,   1);
    foo(5,  35,   1);
    foo(14,  5,   2);
    foo(14, 40,   2);
    foo(5,  21, 147);
}
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
28.12.2019, 15:03  [ТС]
Для примера, если вводить
1
12 02

То должно вывести 0 31, так как через 31 минуту часы окажутся на одной линии. Код, который я предложил, решает задачу, грубо говоря.

Но если написать 1000000000 совпадений, то программа начинает сходить с ума.

(если ввести 33 10 21, то должно вывести 17 28)

Могут ли быть другие пути, кроме как искать время сближения стрелок, и находить углой между ними?
0
245 / 17 / 5
Регистрация: 18.12.2019
Сообщений: 33
28.12.2019, 19:48
Цитата Сообщение от phoenix12 Посмотреть сообщение
Могут ли быть другие пути, кроме как искать время сближения стрелок, и находить углой между ними?
можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
void clock(long long unsigned int k, int h, double m);
int main()
{
clock(1,1,1.0);
}
 void clock(long long unsigned int k, int h, double m){
    if(k==0){
        cout << h << "  " << m << endl;
        return;
    }
    k=k%22;
    k=int(11*(m+h*60)/360+k)%22;
    m=k*360/11.0;
    h=m/60;
    m=m-h*60;
    cout << h << "  " << m << endl;
    return;
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.12.2019, 19:48
Помогаю со студенческими работами здесь

Интересная задача на числа Фибоначчи
Требуется решить данную задачу: Караси и пираньи В озеро «Карасевое» ради эксперимента выпустили пираний. Каждые 10 дней каждые два...

Интересная задача на вывод процентов
Задан текст, слова которого разделены %. Выяснить и вывести на экран, какой процент слов в тексте начинается на заданную букву (буква...

Интересная задача на Обход в глубину
В Тридесятом государстве есть N городов, все города пронумерованы числами от 1 до N. Между городами построены дороги — каждая дорога...

Интересная задача на использование стека
Здравствуйте, уважаемые форумчане! На этот раз решил немного поделиться недавно полученным опытом при решении одной несложной задачи. Само...

Судоку. Задача довольно-таки интересная
Написать программу через рекурсию, делающую судоку.... Добавлено через 2 часа 50 минут а вроде задание так звучит: дан текстовый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru