抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总时间限制: 1000ms 内存限制: 65536kB

描述

甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你 a day in the life, 真的会是 tomorrow never knows? 相信学了计概之后这个不会是难题,现在就来实现吧。

读入一个格式为 yyyy-mm-dd 的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于 1600-01-01,也不晚于 2999-12-30。

输入

输入仅一行,格式为 yyyy-mm-dd 的日期。

输出

输出也仅一行,格式为 yyyy-mm-dd 的日期

样例输入

1
2010-07-05

样例输出

1
2010-07-06

提示

闰年的标准:

  1. 普通年能被 4 整除且不能被 100 整除的为闰年。(如 2004 年就是闰年,1901 年不是闰年)
    地球公转示意图
  2. 世纪年能被 400 整除的是闰年。(如 2000 年是闰年,1100 年不是闰年)
  3. 输入语句 scanf (“% d-% d-% d”,&y,&m,&d) 可以存储年,月,日.输出语句格式类似 printf (“% d-%02d-%02d\n”,year,month,day).

思路

方法一

由题可知,输入一个日期,输出明天的日期。
其中,这将涉及到年、月、日的修改。
首先,将输入的日期的日数加一,然后判断是否需要修改月份,再判断是否需要修改年份。
这里要注意闰年的判断。
如果是闰年,2 月份有 29 天,否则有 28 天。
1、3、5、7、8、10、12 月份有 31 天,其他月份有 30 天。

值得注意的是,如果是闰年且为 2 月份,且日期为 28 号,那么明天就是 29 号。

还有一个点,就是输入的日期中,月份和日期都是负数,所以要将其转换为正数。(这是在 C++ 中的特殊情况)

我的测试用例

用例 1

输入

1
2010-07-05

输出

1
2010-07-06

用例 2

输入

1
2004-02-28

输出

1
2004-02-29

用例 3

输入

1
2003-02-28

输出

1
2003-03-01

用例 4

输入

1
2003-12-31

输出

1
2004-01-01

用例 5

输入

1
1100-02-28

输出

1
1100-03-01

用例 6

输入

1
2003-12-30

输出

1
2003-12-31

用例 7

输入

1
2000-02-28

输出

1
2000-02-29

Code

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>

typedef struct date {
int year;
int month;
int day;
} date;

int main() {
date input;
scanf("%d-%d-%d", &input.year, &input.month, &input.day);
input.day++;
if((input.day > 29) && (input.month == 2) && ((input.year % 4 == 0 && input.year % 100 != 0) || input.year % 400 == 0)) {
input.day = 1;
input.month++;
} else if((input.day > 28) && (input.month == 2) && ((input.year % 4 == 0 && input.year % 100 != 0) || input.year % 400 == 0));
else if(((input.year % 4 != 0 && input.year % 400 != 0) || input.year % 100 == 0) && input.month == 2 && input.day > 28) {
input.day = 1;
input.month++;
} else if((input.month == 1 || input.month == 3 || input.month == 5 || input.month == 7 || input.month == 8 || input.month == 10) && input.month != 12 && input.day > 31) {
input.day = 1;
input.month++;
} else if((input.month == 2 || input.month == 4 || input.month == 6 || input.month == 9 || input.month == 11) && input.month != 12 && input.day > 30) {
input.day = 1;
input.month++;
} else if(input.month == 12 && input.day > 31) {
input.day = 1;
input.month = 1;
input.year++;
}
printf("%d-%02d-%02d", input.year, input.month, input.day);
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;

typedef struct date {
int year;
int month;
int day;
} date;

int main() {
date input;
cin >> input.year >> input.month >> input.day;
input.day *= -1;
input.day++;
input.month *= -1;
if((input.day > 29) && (input.month == 2) && ((input.year % 4 == 0 && input.year % 100 != 0) || input.year % 400 == 0)) {
input.day = 1;
input.month++;
} else if((input.day > 28) && (input.month == 2) && ((input.year % 4 == 0 && input.year % 100 != 0) || input.year % 400 == 0));
else if(((input.year % 4 != 0 && input.year % 400 != 0) || input.year % 100 == 0) && input.month == 2 && input.day > 28) {
input.day = 1;
input.month++;
} else if((input.month == 1 || input.month == 3 || input.month == 5 || input.month == 7 || input.month == 8 || input.month == 10) && input.month != 12 && input.day > 31) {
input.day = 1;
input.month++;
} else if((input.month == 2 || input.month == 4 || input.month == 6 || input.month == 9 || input.month == 11) && input.month != 12 && input.day > 30) {
input.day = 1;
input.month++;
} else if(input.month == 12 && input.day > 31) {
input.day = 1;
input.month = 1;
input.year++;
}
cout << input.year << "-";
if(input.month < 10) cout << "0" << input.month;
else cout << input.month;
if(input.day < 10) cout << "-" << "0" << input.day;
else cout << "-" << input.day;
}