1.日期类问题说明
算法比赛时常遇到关于日期类的问题,例如:给出已知天数,判断是xx年xx月xx日等等,其实这一类问题的核心就是解决:如何已知某一天的年月日,求下一天的年月日(别担心,这句话如果没理解,在后续问题代码实例中会解决的)。
2.基础注意事项
①.12个月每个月的天数:1月:31天,2月:28/29天,3月:31天,4月:30天,5月:31天,6月:30天,7月:31天,8月:31天,9月:30天,10月:31天,11月:30天,12月:31天。
②.处理闰年2月天数的问题:年份为闰年时2月为29天,符合%4000或%40&&%100!=0的为闰年。
3.如何已知某一天的年月日,求下一天的年月日
(我们把实现称为Nextday函数)
//将某一天年月日信息传入,求出下一天的年月日
void NextDay(int& year, int& month, int& day) {
// 存储 月份和天数的对应关系
int dayofMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//这里将月份和数组索引对应了起来
int isLeap;//是否是闰年
isLeap = year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
if (isLeap) {
dayofMonth[2] = 29;//是闰年
}
else {
dayofMonth[2] = 28;//不是闰年
}
++day;//天数++
if (day > dayofMonth[month]) {//判断是否超过月份天数限制
day = 1;
month++;
}
if (month > 12) {//判断是否超过年份月份个数限制
month = 1;
year++;
}
}
4.Nextday函数在日期类问题中的应用
①.已知年月日,计算该日子是本年的第几天
#include <stdio.h>
using namespace std;
void NextDay(int &year, int &month, int &day) {
// 存储 月份和天数的对应关系
int dayofMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
bool isLeap;//是否是闰年
isLeap = year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
if (isLeap) {
dayofMonth[2] = 29;
}
else {
dayofMonth[2] = 28;
}
++day;
if (day > dayofMonth[month]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
int main() {
int year, month, day;
while (scanf("%d%d%d", &year, &month, &day)!=EOF) {
int next=1;//打印是今年的第几天
int curmonth = 1;
int curday = 1;
while (1) {
if (month == curmonth && day == curday) {
break;
}
else
{
NextDay(year, curmonth, curday);//不断执行Nextday函数,算出下一天年月日
++next;//数量++
}
}
printf("%d\n", next);
}
return 0;
}
②.给出年分m和一年中的第n天,算出第n天是几月几号。
#include<stdio.h>
using namespace std;
void NextDay(int& year, int& month, int& day) {
// 存储 月份和天数的对应关系
int dayofMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int isLeap;//是否是闰年
isLeap = year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
if (isLeap) {
dayofMonth[2] = 29;
}
else {
dayofMonth[2] = 28;
}
++day;
if (day > dayofMonth[month]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
int main() {
int year, n;
while (scanf("%d%d",&year,&n)!=EOF) {
int next = 1;//累加进行判断
int curmonth = 1;
int curday = 1;
while (1) {
if (next == n) {//判断是否是第n天
break;
}
else {
NextDay(year, curmonth, curday);//不是第n天,继续下一天
++next;//天数++
}
}
printf("%04d-%02d-%02d", year, curmonth, curday);//这里输出格式注意,%XMd的意思是输出整型占用M个宽度,宽度不够用X填充
}
return 0;
}
③.其他日期类相关问题基本都可以用Nextday函数解决,不过只有动手之下才有意义!!!!!!