ZOJ 1122 Clock

题目大意:

        现要求计算一段时间内分针划过时针的次数。

        每行输入一个起始时间和终止时间(比如3 40 7 33,就表示起始时间是3:40,终止时间是7:33),输入的行数不确定,其中给定的时间不会有刚好分针时针重合的情况(比如12 00这样的数据就不会给),从开始到结束时针不会旋转超过360度,但不过从开始到结束时针可能会经过12点,这种情况下可以理解为起始是上午结束时下午,或者起始是晚上结束时早上,总之时间超不超过12个小时,对于每一行输入都要计算这段时间内时针扫过分针多少次,注释输入格式,时间上小时和分钟都占两位,十位没有用0补齐。

题目链接

注释代码:

/*                        
 * Problem ID : ZOJ 1122 Clock    
 * Author     : Lirx.t.Una                        
 * Language   : C              
 * Run Time   : 0 ms                        
 * Run Memory : 168 KB                        
*/

#include <stdio.h>

int
main() {
	
	int		sh, eh;//starting hour and end hour,起始和结束的小时
	int		sm, em;//starting minute and end minute,起始和结束的分钟
	//把时间看成一个一维的x轴,00:00为原点,长度单位为1分钟,比如3:33的坐标就是3 × 60 + 33
	//注意,为了闭包,12:00表示坐标0,因此12:xx的坐标为xx
	int		sx, ex;//start x and end x axis
	int		ps;//passing times,分针扫过时针的次数
	
	printf("Program 3 by team X\n");
	printf("Initial time  Final time  Passes\n");
	
	while ( ~scanf("%d%d%d%d", &sh, &sm, &eh, &em) ) {
		
		//计算起始和终止的坐标
		sx = ( sh % 12 ) * 60 + sm;
		ex = ( eh % 12 ) * 60 + em;
		
		//计算方法是:
		//时针转整整一周扫过次数刚好为11次,因此可以按比例划分
		//从原点经过12个小时的坐标刚好是720
		ps = ex * 11 / 720 - sx * 11 / 720;
		//!!!注意!!:不能将该式子化简合并,如果合并了答案就变成了从时刻0
		//到时间点end - start之间的扫过次数了
		
		printf("       %02d:%02d", sh, sm);
		printf("       %02d:%02d", eh, em);
		printf("%8d\n", sx > ex ? ps + 11 : ps);//如果差值为负数则再补一个周期即可
	}
	
	printf("End of program 3 by team X\n");
	
	return 0;
}

无注释代码:

#include <stdio.h>

int
main() {
	
	int		sh, eh;
	int		sm, em;
	int		sx, ex;
	int		ps;
	
	printf("Program 3 by team X\n");
	printf("Initial time  Final time  Passes\n");
	
	while ( ~scanf("%d%d%d%d", &sh, &sm, &eh, &em) ) {
		
		sx = ( sh % 12 ) * 60 + sm;
		ex = ( eh % 12 ) * 60 + em;
		
		ps = ex * 11 / 720 - sx * 11 / 720;
		
		printf("       %02d:%02d", sh, sm);
		printf("       %02d:%02d", eh, em);
		printf("%8d\n", sx > ex ? ps + 11 : ps);
	}
	
	printf("End of program 3 by team X\n");
	
	return 0;
}

单词解释:

analog:adj, 模拟的,有长短针的

instant:adj, 立即的,紧迫的; n, 瞬间,即刻

revolution:n, 旋转,循环,革命

vice versa:反之亦然

dial:n, 转盘,刻度盘,钟面

observe:vt, 注意

colon:n, 冒号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值