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 星系炸弹日期计算的主要内容,如果未能解决你的问题,请参考以下文章