时钟(分针和时针的重合问题)

问题描述

从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;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JYeontu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值