小Q有一块很旧的电子表,上面会显示当前的时间,如Y年M月D日h时m分s秒。小Q在2012年1月1日0时0分0秒的时候根据标准时间调整过表,但是也正因为这次调整,这块旧表出现了一些奇怪的电子故障:时钟、分钟和秒钟在显示20之后,将跳过21而直接显示22。也就是说秒钟从20跳转到22只需要1秒,分钟从20跳转到22只需要59秒(因为秒钟从20到22只用1秒),时钟依此类推。小Q只有这一块电子表,所以他想从表上显示的时间推算出当前真正的时间。
输入:
第一行有一个正整数T (T <=100),描述有多少组数据。每一组输入有一行,用来描述电子表的时间,格式为:Y-M-D h:m:s
Y表示年份(在本题中一定是2012),M表示月份,D表示日期。这三个数字用-隔开,接下来是一个空格。之后的h,m,s分别表示时、分、秒。保证输入的数据都是合法的,其中h,m,s都不会显示为21。
输出:
对于每一个电子表显示的日期时间,输出当前真正的时间。注意所有的月份、日期、时、分、秒不足两位数的时候,前面都有前缀0。
样例输入:
2
2012-01-01 00:00:20
2012-01-01 00:00:22
样例输出:
2012-01-01 00:00:20
2012-01-01 00:00:21
注意事项:可行代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int daysOfMonth[] = { 0,
31, 29, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31,
};
int main(int argc, char *argv[])
{
int T;
int i;
int j;
int year;
int month;
int day;
int hour;
int minute;
int second;
int days;
int seconds;
int minutes;
int hours;
FILE *fp = fopen("{sysFileUrl}", "r");
if(NULL != fp) {
fscanf(fp, "%d", &T);
for(i = 0; i < T; ++i) {
fscanf(fp, "%d-%d-%d %d:%d:%d",
&year, &month, &day,
&hour, &minute, &second);
days = 0;
for(j=1; j < month; ++j){
days += daysOfMonth[j];
}
--day; //天数从1号开始
days += day; //经过的总天数;
if(second > 20) --second;
if(minute > 20) --minute;
if(hour > 20) --hour;
seconds = days * 23 * 59 * 59 + hour * 59 * 59 + minute * 59 + second;
second = seconds % 60;
minutes = seconds / 60;
minute = minutes % 60;
hours = minutes / 60;
hour = hours % 24;
days = hours / 24;
for(j = 1; j <= 12; ++j) {
if(days >= daysOfMonth[j]) {
days -= daysOfMonth[j];
} else {
break;
}
}
day = ++days;
month = j;
printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second);
}
fclose(fp);
}
return 0;
}