问题描述
从a点b分到s点t分时针和分针重合多少次?
输入
有多组数据,每组1行4个数 a,b,s,t. 1<=a,s <=12, 0<=b,t<60. 0 0 0 0结束.
输出
参看以下样例
输入样例 1
12 50 1 2
3 8 3 20
2 45 11 0
11 0 3 20
1 2 12 50
3 20 3 8
0 0 0 0
输出样例 1
0
1
8
4
11
10
题目并不难理解,就是要我们计算两个时间点内时针和分针的重合次数。
对此我们先对分针和时针的重合规律做一下分析:
不难发现从1~12h,每一小时分针和时针都会重合一遍,而0~1h内,时针和分针不会重合,也就是说,在完整的12小时内,分针和时针只会重合11次。
另外我们还需要知道的是分针和时针每分钟移动的角度:
1、分针:分针每分钟走整个钟面的1/60,所以时针每分钟走的度数为6°。
2、时针:时针每分钟走整个钟面的1/720,所以时针每分钟走的度数为0.5°。
程序设计:
一、大致可以分为三种情况:
1、两个时间点在同一个小时内,且后一个时间点大于前一个时间点。即:a==s&&b<t
对此我们只需分别判断两个时间点的时针和分针的角度大小关系即可。
若时间点一的分针角度小于时针角度,同时时间点二的分针角度大于时针角度,重合次数加一,其他情况重合次数不变。
2、两个时间点在同一个周期(12h)内。即:a<s
对此我们主要分三步计算:
(1)判断a:b~a+1:00是否有重合;
(2)判断a+1~s:00的重合次数(s-a-1);
(3)判断s:00~s:t是否有重合。
3、两个时间点不在同一个周期(12h)内。即:(a==s&&b>t)||(a>s)
对此我们也分三步来计算:
(1)判断a:b~a+1:00是否有重合;
(2)判断a+1~12:00的重合次数+1:00~s:00的重合次数(12-a-1+s-1);
(3)判断s:00~s:t是否有重合。
代码如下:
#include<stdio.h> int main() { int a,b,s,t; while(scanf("%d %d %d %d",&a,&b,&s,&t)) { int sum=0; if(a==0&&b==0&&s==0&&t==0) break; float h1=a*30+0.5*b,m1=b*6,h2=s*30+0.5*t,m2=t*6; //printf("h1=%.2f m1=%.2f h2=%.2f m2==%.2f\n",h1,m1,h2,m2); if(a==s&&b<t) { if(h1>m1&&h2<m2) sum++; } else if(a<s) { if(h1>m1) sum++; if(h2<m2) sum++; sum+=s-a-1; } else { if(h1>m1) sum++; if(h2<m2) sum++; sum+=12-a-1; sum+=s-1; } printf("%d\n",sum); } return 0; }