Pers.narod.ru. Алгоритмы. Часовая и минутная стрелки на одной линии |
Задано время в часах и минутах, указывающее момент времени "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.
|
|