套路

以前大一的时候面对这个题,就是单纯按月份纯算,算的可谓是焦头烂额。现在学习了新的方法:

  1. 计算是当年的第几天
  2. 这个数值sum加上需要累加的天数
  3. 计算进位的多少年,确定年份
  4. 根据剩下的第几天反解出这是几月几日
  5. 输出

技巧

用到的技巧包括打表、巧用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);
    }
}