一、日期问题的常用技巧
①数组+②循环
a. year → 闰年?
year%400 == 0 || year%100 != 0 && year%4 == 0
&&优先级高于||
b. month → 一个月有多少天?
方法一:if(month == 1)…else if(month == 2)…
方法二:辅助数组 mday[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
用空间换时间 → mday[7] = 31
二、今年的第几天
1990年 9月 20日是今天第几天?
方案一:1990年1月1日 → 1990年9月1日 → 1990年9月20日
方案二(万能方案):1990年1月1日 → 1990年1月2日 → 1990年1月3日 → … → 1990年9月20日
代码
方案一:
#include <cstdio>
int main() {
int year,mon,day;
int mday[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int totalDay[13] = {0};
for (int mon = 2; mon <= 12; ++mon) {
// 到mon月1日的天数 = 到mon-1月1日的天数+第mon-1月的天数
totalDay[mon] = totalDay[mon-1] + mday[mon-1];
}
while (scanf("%d%d%d",&year,&mon,&day) != EOF){
// 如果是闰年
bool isleap = year%400==0 || year%100!=0 && year%4==0;
if(isleap==true && mon >= 3){
printf("%d\n",totalDay[mon] + day + 1);
} else{
printf("%d\n",totalDay[mon] + day);
}
}
return 0;
}
三、打印日期
描述:给出年份m和一年中的第n天,算出第n天是几月几号。
万能方案nextDay
按照yyyy-mm-dd的格式
printf("%04d-%02d-%02d\n",year,mon,day);
%4d 至少4个位置宽,用空格填充
%04d 至少4个位置宽,用0填充
代码
//方案二
#include <cstdio>
int main(){
int year,n;
int mday[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
while (scanf("%d%d",&year,&n) != EOF){
int mon = 1;
int day = 1;
for (int i = 0; i < n-1; ++i) {
//nextDay
bool isleap = year%400 == 0 || year%100 != 0 && year%4 ==0;
if(isleap){
mday[2] = 29;
} else{
mday[2] = 28;
}
++day;
if(day > mday[mon]){
++mon;
day = 1;
if(mon > 12){
mon = 1;
++year;
}
}
}
printf("%04d-%02d-%02d\n",year,mon,day);
}
}