很多编程题都涉及日期问题,最常见的就是给出一个 xx年xx月xx日 的日期,求 n 天后的 xx年xx月xx日。
每年的天数不同,每个月的天数也不同,这使得问题变得更加复杂。
众所周知,每年的二月份的天数有两种,29天和28天。决定二月份的天数不同的就是闰年。
闰年:1. 年份非整百且能被4整除的为闰年。
2. 年份能被400整除的是闰年。
实现代码:
int is_leap_year(int y){
if( y%400==0 || ( y%100 != 0 && y%4==0 )){
return 1;
}
return 0;
}
接下来处理各个月的天数问题,这里推荐把每个月的天数存到数组里。
1,3,5,7,8,10,12 是 31天, 其他为30天,其中2月份先存28天。
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
为了便于遍历数组,可把第一个位置初始化为0。
下面为完整程序:
#include <cstdio>
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int y,m,d,k;
scanf("%d%d%d%d",&y,&m,&d,&k); // y为年, m为月, d为天数,即 y-m-d, k为过了多少天的天数
for(int i=1; i<=k; i++){
if(y%400==0 || (y%100 != 0 && y%4==0)){
month[2] = 29; //判断是否为闰年
}else{
month[2] = 28;
}
d++; //每次循环天数 d 就加 1
if(d == month[m]+1){ //天数满足当前月份时,天数 d归 1, 代表下一月一号,月份m向前走一步
d=1;
m++;
}
if(m == 13){ // 当月份到了 13, 就意味着 过了一年
m=1; // m 归为 1, 代表下一年一月份, 年数y 向前走一步
y++;
}
}
printf("%04d-%02d-%02d",y,m,d);
return 0;
}