套路
以前大一的时候面对这个题,就是单纯按月份纯算,算的可谓是焦头烂额。现在学习了新的方法:
- 计算是当年的第几天
- 这个数值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); } }