UVA10339 【Watching Watches】

题目大意:有两个时钟,一个每天慢\(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;
}

完结撒花∩( ・ω・)∩

上一篇:正则表达式前端js,银行卡号脱敏


下一篇:Oracle数据库REPLACE+SUBSTR用*对姓名/身份证进行脱敏处理