top1编程
← 返回题目
题解

输出时间

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4262 输出时间(入门)

    解题思路

    这道题和"电影时长"一样,把总秒数拆成"时:分:秒"。区别有两点:

    1. 必须用 scanf 输入、printf 输出;
    2. 时、分、秒都要占满 2 位,不足 2 位前面补 0,比如 8 要写成 08。

    换算三步走(以 29425 为例):

    • 小时 h = 29425 / 3600 = 8。
    • 去掉整小时剩下的秒数 = 29425 % 3600 = 625,分钟 m = 625 / 60 = 10。
    • 秒 s = 625 % 60 = 25。

    输出用 printf("%02d:%02d:%02d", h, m, s)。%02d 的意思是"这个数占 2 格,不够 2 格就在前面补 0"。比如 h=8 会输出 08,所以结果是 08:10:25,和样例一致。

    边界情况:

    • t 最小 20000、最大 100000,小时数最多 27,int 装得下。
    • 如果某一项小于 10(比如分钟是 5),%02d 会自动补成 05,这正是题目要的格式。
    • 注意 scanf 里 &t 的取地址符号不能少,否则程序会读错。

    参考代码

    // 用途:用scanf输入总秒数t,换算成时分秒后用printf按HH:MM:SS格式输出
    #include <cstdio>
    using namespace std;
    
    int main() {
        int t;
        scanf("%d", &t);
        int h = t / 3600;        // 小时:总秒数除以3600
        int m = t % 3600 / 60;   // 分钟:去掉整小时后除以60
        int s = t % 60;          // 秒:最后的余数
        printf("%02d:%02d:%02d\n", h, m, s);   // %02d表示占2位,不够补0
        return 0;
    }
    

    复杂度分析

    只做固定几次除法和取余,然后一次 printf 输出,时间复杂度 O(1),额外空间 O(1)。t 最大 100000,所有中间结果都不超过 100000,用 int 完全够,不存在溢出风险。

    • 1