套路
以前大一的时候面对这个题,就是单纯按月份纯算,算的可谓是焦头烂额。现在学习了新的方法:
- 计算是当年的第几天
- 这个数值sum加上需要累加的天数
- 计算进位的多少年,确定年份
- 根据剩下的第几天反解出这是几月几日
- 输出
技巧
用到的技巧包括打表、巧用bool。
提前写出来每个月有多少天、每年有多少天。
还有判断是否闰年函数,用它能够得到bool值,0和1可以分别对应于平年和闰年,所以上面的可以构造成二维数组。
代码
#include <bits/stdc++.h>
using namespace std;
bool isLeap(int year){
if(year%400==0) return true;
else if(year%4==0&&year%100!=0) return true;
return false;
}
int main(){
int days[2][12]={
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31},
};
int n;
scanf("%d",&n);
for(int current = 0; current<n; current++){
int year,month,date,plus;
scanf("%d %d %d %d",&year,&month,&date,&plus);
int y=0,m=1,d=0;
int sum=0;
bool leap = isLeap(year);
for(int i=1;i<month;i++){
sum+=days[leap][i-1];
}
sum+=date;
sum+=plus;
y=year;
//逐年增加,直到sum<对应天数
int total[2] = {365,366};
while(sum>total[isLeap(y)]){
sum-=total[isLeap(y)];
y++;
}
//反解为日期
leap = isLeap(y);
for(int i=1;sum>days[leap][i-1];i++){
m++;
sum-=days[leap][i-1];
}
d=sum;
printf("%04d-%02d-%02d\n",y,m,d);
}
} 
京公网安备 11010502036488号