1 条题解

  • 0
    @ 2025-8-24 22:42:03

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lichenzhen
    这个人已经AFO了

    搬运于2025-08-24 22:42:03,当前版本为作者最后更新于2022-12-20 23:12:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路

    先看一下题目,发现就是一道模拟题,但是又一些细节的。

    首先是数据的规模:时间不超过 101810^{18},所以需要开 long long。

    然后首先要忽略掉毫秒。

    这里普及一个知识: 1s1s = 1000ms1000ms

    所以需要忽略后面的三位。直接整除 10001000 就可以了。

    之后就是处理时分秒了:

    1.小时

    由于只是算一天,2424 小时之内,所以要把完整的一天去掉,也就是把对每天的秒数取余,余数就是除了整天剩余的秒数,每天的秒数用24*60*60来表示(当然你也可以直接算出来结果是 8640086400)。然后用最后一天剩余的秒数整除每小时的秒数60*60(也就是 36003600),就是小时值了。

    2.分钟

    分钟要先对每小时的秒数60*60取余,余数就是除了整小时以外剩余的秒数。之后整除 6060 就是剩余的秒数中整分钟的数,就是分钟值了。

    3.秒

    直接对60取余,剩下的就是秒了。

    时间的处理就搞好了。下面就是输出了,题目要求时、分、秒不足两位时补前导 00。所以这是一个细节。

    当然你可以用printf进行域宽的输出,但是我这里介绍一个用cin的方法。

    要用到两个函数:

    一个是setw()函数,这个函数可以限定域宽,宽度就是括号里的数字。

    另外一个setfill()函数,这个函数可以设置当实际的宽度不足setw()函数的值时,用某个字符来补足。(setfill()函数最好放在setw()函数前面)

    这样就可以了。

    参考代码

    #include<bits/stdc++.h>
    using namespace std; 
    int main()
    {
    	long long t,hh,mm,ss;
    	cin>>t;
    	t/=1000;
    	hh=t%(24*60*60)/(60*60);//时
    	mm=t%(60*60)/60;//分
    	ss=t%60;//秒
    	cout<<setfill('0')<<setw(2)<<hh<<setfill('0')<<setw(2)<<mm<<setfill('0')<<setw(2)<<ss;
       //注意setfill()函数内的值是字符,要加单引号。
       return 0;
    }
    
    • 1

    信息

    ID
    7926
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者