Time
| ||||||
Description | ||||||
Kim是一个掌控时间的大师。不同于一般人,他习惯使用秒来计算时间。如果你问他现在是几点,他会告诉你现在是今天的xxxx秒。Mik想要考考Kim。他想知道从某一天的00:00:00开始,经过s秒后是哪一天。但是Mik不会计算答案,他需要你的帮助。 注意:我们认为一天从00:00:00开始,到23:59:59结束。00:00:00经过1秒后是00:00:01;从00:00:00开始,加86400(60*60*24)秒后就是下一天的00:00:00. | ||||||
Input | ||||||
第一行一个整数T表示数据组数。 接下来T行,每行一个日期yyyy-MM-dd,接下来一个整数s表示s秒。 | ||||||
Output | ||||||
对于每个输入,输出一行yyyy-MM-dd 表示答案。对于不足两位的数要补齐前导0。 | ||||||
Sample Input | ||||||
3 2016-12-10 1000 2016-02-28 86400 2016-01-01 1000000 | ||||||
Sample Output | ||||||
2016-12-10 2016-02-29 2016-01-12 | ||||||
Hint | ||||||
T<=100 s<=2147483647 日期在1800-01-01到2100-01-01之间 闰年的判断: 1.能被4整除且不能被100整除的为闰年. 2.能被400整除的是闰年. | ||||||
Source | ||||||
"科林明伦杯"哈尔滨理工大学第六届程序设计团队赛 |
这题主要是写的时候思路不要乱了。还有就是要严格考虑平年闰年的情况。。
先把给的秒数转化为天数,再逐渐累加到年份上。特别注意对二月的判定。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int DAY[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};///平年二月28,闰年29天
int change(int t)///秒数转天数
{
return t/=86400;
}
bool pd(int year)///判断平年闰年
{
if((year%400==0)||(year%4==0&&year%100!=0))
{
return true;
}
else
{
return false;
}
}
int year,mon,day,sec,addday;
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d-%d-%d %d",&year,&mon,&day,&sec);
addday=change(sec);///转换为天数
if(addday<1)///如果不足一天,直接输出
{
printf("%d-%02d-%02d\n",year,mon,day);
continue;
}
else if(addday>=1)///大于一天
{
int daysum=day+addday;
while(daysum)
{
if(pd(year))///是闰年
{
DAY[2]=29;
}
else
{
DAY[2]=28;
}
if(daysum>DAY[mon])///大于当前月的天数
{
daysum-=DAY[mon];
mon++;///月数自增
if(mon>12)
{
year++;///年数自增
mon=1;
}
}
else
{
day=daysum;
break;
}
}
printf("%d-%02d-%02d\n",year,mon,day);
}
}
return 0;
}