Определение угла между стрелками часов
Даны целые числа H и M (0 < H <= 12 , 0 <= M <= 60),
указывающие момент времени : "H часов M минут"
Определить наименьшее время (число полных минут),
которое должно пройти до того момента, когда часовая
и минутная стрелки расположатся перпендикулярно друг другу.
Прежде всего убедимся, что если решать задачу в целых числах, то искомых моментов времени всего два 3:00 и 9:00.
const eps = 0.00001;
var h,m,s,hs,i,k:byte;
function rightAngle(h,m,s,hs:byte):boolean;
var a,r:real;
begin
a:=pi/6*(h-11*m/60-11*s/(300*12)-11*hs/(300*12*100));
r:=cos(a);
rightAngle:=(abs(r)<eps);
if (abs(r)<eps) then
write('a=',180*a/pi:16:9,' ');
end;
begin
writeln;
for h:=0 to 11 do
for m:=0 to 59 do
for s:=0 to 59 do
for hs:=0 to 99 do
if (rightAngle(h,m,s,hs))
then writeln(h:2,':',m:2,':',s:2,':',hs:2,' ugol pryamoy');
end.
Angle | HH:MM:SS:HS |
------------- | ----------- |
-90.000166667 | 0:16:21:82 |
-269.999583330 | 0:49:05:45 |
-270.000500000 | 0:49:05:46 |
-89.999916667 | 1:21:49:09 |
-270.000250000 | 1:54:32:73 |
-89.999666667 | 2:27:16:36 |
90.000000000 | 3:00:00:00 |
-90.000333333 | 3:32:43:64 |
90.000250000 | 4:05:27:27 |
-90.000083334 | 4:38:10:91 |
90.000500000 | 5:10:54:54 |
89.999583333 | 5:10:54:55 |
-89.999833333 | 5:43:38:18 |
89.999833333 | 6:16:21:82 |
-89.999583334 | 6:49:05:45 |
-90.000500000 | 6:49:05:46 |
90.000083334 | 7:21:49:09 |
-90.000250000 | 7:54:32:73 |
90.000333333 | 8:27:16:36 |
270.000000000 | 9:00:00:00 |
89.999666667 | 9:32:43:64 |
270.000250000 | 10:05:27:27 |
89.999916667 | 10:38:10:91 |
270.000500000 | 11:10:54:54 |
269.999583330 | 11:10:54:55 |
90.000166667 | 11:43:38:18 |
А дальше уже просто:
tm = h*60+m;
if tm <=180
then p:=180-tm
else if (tm <= 540)
them p:=560-tm
else
p:=720-tm+180
writeln('число полных минут: ',p);
|