题目大意:
现要求计算一段时间内分针划过时针的次数。
每行输入一个起始时间和终止时间(比如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, 冒号