题目大意:有两个时钟,一个每天慢\(a\)秒,另一个每天慢\(b\)秒,询问两个时钟下一次重合的时刻\(.\)
时刻重合也就是整整相差一周的时候,一周为\(12\)个小时,总共\(12* 60 * 60\)秒,用这个数除以\(abs(a-b)\)即为走多少天后两个时钟重合。接下来用需要走的天数$ * $ 某一个表每天走的时间即为答案。
几个要注意的点:
最后的答案要注意化为时间格式。
每一个钟表走的时间要减去少走的时间。
\(0\)时要注意化为\(12\)时。
为避免精度误差,需要走的天数我们用\(double\)类型来存。
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#define D double
#define abs(a) ((a) < 0 ? -(a) : (a)) // 用三目运算符代替cmath库的函数
const int circle = 12 * 60 * 60; // 时钟一周的秒数
const int day = 24 * 60 * 60; // 时钟一天走的秒数
int a, b;
int main() {
while (scanf("%d%d", &a, &b) == 2) {
int ooo = abs(a - b);
if (ooo == 0) { // 特判两时钟一开始就重合的情况
printf("%d %d 12:00\n", a, b);
return 0;
}
D ankh = circle * 1.0 / ooo; // 需要走的天数
int minute = (int)(ankh * (day - a) / 60.0 + 0.5) % day; // 秒数转为分钟数,+ 0.5向上取整
int hour = minute / 60;
hour %= 12;
if (hour == 0) hour = 12; // 0时即12时
minute %= 60;
printf("%d %d %02d:%02d\n", a, b, hour, minute); // %02d 自动追加前导0补齐两个位宽
}
return 0;
}
完结撒花∩( ・ω・)∩