Halo

A magic place for coding

0%

CCF--日期计算

日期计算问题

问题描述

 给定一个年份y和一个整数d,问这一年的第d天是几月几日?
 注意闰年的2月有29天。满足下面条件之一的是闰年:
 1) 年份是4的整数倍,而且不是100的整数倍;
 2) 年份是400的整数倍。

输入格式

 输入的第一行包含一个整数y,表示年份,年份在1900到2015之间(包含1900和2015)。
 输入的第二行包含一个整数d,d在1至365之间。

输出格式

输出两行,每行一个整数,分别表示答案的月份和日期。

样例输入

2015
80

样例输出

3
21

样例输入

2000
40

样例输出

2
9

解决方法

分析

这个问题分为两部分,其一是判断闰年问题;第二个计算月份问题。判断闰年问题较简单,这里着重分析月份问题。
我们需要通过计算每个月之前共有多少天来判断已经过去的天数,同时,要注意边界情况,比如说1月1号,2月28号这些特殊的情况。

代码实现

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
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;

int main() {
int year, day;
cin >> year >> day;

bool isLeapYear = false;
if (year % 4 == 0 && year % 100 != 0) {
isLeapYear = true;
}
if (year % 400 == 0) {
isLeapYear = true;
}

if (isLeapYear) {
int daysInMonth[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
for (int i = 0; i <= 12; i++) {
if (day == daysInMonth[i]) {
cout << i << endl;
cout << daysInMonth[i] - daysInMonth[i-1];
break;
}
if (day >= daysInMonth[i] && day < daysInMonth[i+1]) {
cout << i+1 << endl;
cout << day - daysInMonth[i];
break;
}
}
}
else {
int daysInMonth[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
for (int i = 0; i <= 12; i++) {
if (day == daysInMonth[i]) {
cout << i << endl;
cout << daysInMonth[i] - daysInMonth[i-1];
break;
}
if (day > daysInMonth[i] && day < daysInMonth[i+1]) {
cout << i+1 << endl;
cout << day - daysInMonth[i];
break;
}
}
}
return 0;
}

这题的讲解到这里结束了,谢谢!

Welcome to my other publishing channels