LQ0002 星系炸弹日期计算

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0002 星系炸弹日期计算相关的知识,希望对你有一定的参考价值。

题目出处:蓝桥杯2015初赛

题目描述

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,a年b月c日放置,定时为n天,请你计算它爆炸的准确日期。

输入

输入存在多组数据,每组数据输入一行,每一行输入四个正整数a,b,c,n
输入保证日期在1000-01-01到2020-01-01之间,且日期合法。
n不超过1000

输出

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。

样例输入

2015 1 1 15
2014 11 9 1000

样例输出

2015-01-16
2017-08-05

注意:
printf(“%d-%02d-%02d\\n”, y, m, d);//%02d表示占两个位置,如果位置不够,就用0来占。

问题分析
日期计算问题,一般采用模拟计算。
计算方法有2种,按天模拟是比较慢的一种,也许比较好懂一点,然而算得费时。
还有一种是先一年一年过,再一个月一个月过,再按天过。这种计算需要先退到那一年的首日开始计算。

AC的C语言程序(按天模拟)如下:

/* LQ0002 星系炸弹 */

#include <stdio.h>

int mdays[] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

int leapyear(int year)

    return ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) ? 1 : 0;


int main()

    int y, m, d, n;
    while (~scanf("%d%d%d%d", &y, &m, &d, &n)) 
        mdays[2] = 28 + leapyear(y);
        while (n--) 
            if (++d > mdays[m]) 
                d = 1;
                if (++m > 12)
                    m = 1, y++, mdays[2] = 28 + leapyear(y);
            
        
        printf("%d-%02d-%02d\\n", y, m, d);
    

    return 0;

AC的C语言程序(快速模拟)如下:

/* LQ0002 星系炸弹 */

#include <stdio.h>

int mdays[] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

int leapyear(int year)

    return ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) ? 1 : 0;


int monthdays(int year, int month)

    return month == 2 ? mdays[month] + leapyear(year) : mdays[month];


int main()

    int y, m, d, n;
    while (~scanf("%d%d%d%d", &y, &m, &d, &n)) 
        /* 先退回到y年1月1日 */
        for (int i = 1; i < m; i++)
            n += monthdays(y, i);
        n += d - 1;

        /* 计算年:一年一年算 */
        for (; ;) 
            int year = 365 + leapyear(y);
            if (n >= year)
                n -= year, y++;
            else
                break;
        

        /* 计算月:一个月一个月算 */
        for (m = 1; ;m++) 
            int md = monthdays(y, m);
            if (n >= md)
                n -= md;
            else
                break;
        

        printf("%d-%02d-%02d\\n", y, m, n + 1);
    

    return 0;

以上是关于LQ0002 星系炸弹日期计算的主要内容,如果未能解决你的问题,请参考以下文章

星系炸弹

2015_B t2星系炸弹

2015_B t2星系炸弹

bzoj5017: [Snoi2017]炸弹

python 计算拉链炸弹的理论未压缩尺寸。

[LOJ#2255][BZOJ5017][Snoi2017]炸弹