奇怪的电子表

Q有一块很旧的电子表,上面会显示当前的时间,如YMDhms秒。小Q201211000秒的时候根据标准时间调整过表,但是也正因为这次调整,这块旧表出现了一些奇怪的电子故障:时钟、分钟和秒钟在显示20之后,将跳过21而直接显示22。也就是说秒钟从20跳转到22只需要1秒,分钟从20跳转到22只需要59秒(因为秒钟从2022只用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

注意事项:
1.模板语言仅作参考, "{sysFileUrl}"为系统输入文件,请不要修改。
2.可多次运行,运行正确后请  切记提交保存,保存后将不能修改。
3.运行只判断结果是否正确,不输出具体结果。
4.若系统卡死请先备份代码,可刷新页面后再次运行。
5.程序运行时间限制10s,内存限制128M。

可行代码:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值