Nickolay.info. Алгоритмы. Часовая и минутная стрелки на одной линии

Задано время в часах и минутах, указывающее момент времени "M часов, N минут". Определить наименьшее время (число минут), которое должно пройти до момента, когда часовая и минутная стрелки на циферблате совпадут или окажутся одна напротив другой, то есть, расположатся на одной линии.

Расчёт выполнен в целых числах, всю работу выполняет функция clock_arrows_coincidence, в программу добавлено 10 тестов, ошибок не нашёл, хотя на 100% в правильности кода не уверен.

Допустимы значения M от 0 до 12 включительно и N от 0 до 60 включительно, впрочем, функция сама их приведёт к допустимым.

function clock_arrows_coincidence (m,n:integer):integer;
{m часов, n минут. Вернет время в минутах x,
через которое часовые стрелки будут на одной линии}
var nk,m1,m2,x:integer;
begin m:=m mod 12; n:=n mod 60;
 nk:=n div 12;
 m1:=m*5+nk;
 m2:=m1+30;
 if m1<31 then
  if n>m1 then
   if n<m2 then x:=m2-n
   else x:=60-n+m1
  else x:=m1-n
 else if n<m1 then
  if n>m2-60 then x:=m1-n
  else x:=m2-60-n
 else x:=m2-n;
 clock_arrows_coincidence:=x+x div 12;
end;

const test : array [1..10,1..2] of integer = (
 (0,0), (9,30), (11,15), (1,1), (9,8),
 (8,11), (8,9), (12,59), (5,30), (7,22)
);
var i,r:integer;
begin
 for i:=1 to 10 do begin
  r:=clock_arrows_coincidence(test[i,1],test[i,2]);
  writeln (test[i,1]:2,':',test[i,2]:2,' - через ',r,' мин.');
 end;
 writeln ('Enter для выхода...');
 reset (input); readln;
end.

P.S. Комментарий от читателя Виктора:

в месте

clock_arrows_coincidence:=x+x div 12;

надо делить на 11! Потому что надо учитывать разницу скоростей между стрелками! Проверте для времени 11:36.

Но для 11:15, к примеру, тогда получается 11:27, но не 11:26. В общем, с кодом можно экспериментировать :)

Рейтинг@Mail.ru

вверх гостевая; E-mail