题目描述
给定一个年份 y 和一个整数 d,问这一年的第 d 天是几月几日?
注意闰年的 2 月有 29 天。
满足下面条件之一的是闰年:
- 年份是 4 的整数倍,而且不是 100 的整数倍;
- 年份是 400 的整数倍。
输入格式
输入的第一行包含一个整数 y,表示年份,年份在 1900 到 2015 之间(包含 1900 和 2015)。
输入的第二行包含一个整数 d,d 在 1 至 365 之间。
输出格式
输出两行,每行一个整数,分别表示答案的月份和日期。
数据范围
1900≤y≤2015,
1≤d≤365
输入样例1:
2015
80
输出样例1:
3
21
输入样例2:
2000
40
输出样例2:
2
9
解题思路
1、首先输入年份和天数
2、根据题目提示:可以判断年份是否为闰年
3、定义月份的数组(分为闰年和平年),此题因为天数为总天数,所以月份也计算每个月及这个月之前·的天数
4、计算是几月:如果天数刚好等于这个月的最后一天,即为这个月;如果大于这个月的天数,则为这个月+1;
5、计算日期:直接用天数减去前一个月份数组的天数即可得到。
代码
cpp
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
//定义年份y(year)和天数d(day)
int y, d;
//输入年份和天数
scanf("%d %d", &y, &d);
//判断是否为闰年的标志
bool flag;
//判断年份是否为闰年
if( ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0) ){
//是闰年则flag 为 1
flag = 1;
}
else{
flag = 0;
}
//定义闰年的每月月份及加上次月份之前天数
int month_r[13] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
//定义平年的每月月份及加上次月份之前天数
int month_p[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
//定义月份、日期
int month = 0, date = 0;
//如果是闰年,计算月份
if(flag == 1){
for(int i = 0; i < 13; i ++){
if(d > month_r[i]){
month = i+1;
}
else if(d == month_r[i]){
month = i;
}
}
}
//平年,计算月份
else{
for(int i = 0; i < 13; i ++){
if(d > month_p[i]){
month = i+1;
}
else if(d == month_p[i]){
month = i;
}
}
}
//计算日期
//如果是闰年
if(flag == 1){
date = d - month_r[month-1];
}
//平年
else{
date = d - month_p[month-1];
}
//输出月份和日期
printf("%d\n%d\n", month, date);
return 0;
}
恭喜你!又学会了一道CCF-CSP题目。这里是希望你越来越好的小全全!一起努力学习吧!