P8748 题解

· · 题解

思路

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

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

然后首先要忽略掉毫秒。

这里普及一个知识: 1s = 1000ms

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

之后就是处理时分秒了:

1.小时

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

2.分钟

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

3.秒

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

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

当然你可以用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;
}