此题巧妙的地方在于
${\color{Violet} {\LARGE 将输入之后的日期的month和day都加到a上面,让日期变为 } } $
${\color{Orange} {\LARGE year的1月1日,之后再进行处理就会方便很多。 } } $
${\color{Purple} {\LARGE 先一年一年处理,再每月处理,剩下的不足一个月的数就是day } } $
注意
if(i == 2 && a > (days[i] + LeapYear(y))) a -= (days[i] + LeapYear(y));
else if(i != 2 && a > days[i]) a -= days[i];
else {
printf("%04d-%02d-%02d\n", y, i, a);
break;
}
这里第二个判断条件一定需要加上 ${\color{Red} {\LARGE i != 2} } $ 因为不加的话,当 $i == 2$ 时,也满足 $a > days[i]$ ,else if里面的也会执行,这样就会多减掉 $day[2]$.
C++代码
#include<iostream>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int LeapYear(int year) {
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return 1;
return 0;
}
int ToStart(int year, int month, int day) {
int ans = day;
for(int i = 0; i < month; i++) {
if(i == 2) ans += (days[i] + LeapYear(year));
else ans += days[i];
}
return ans;
}
int main() {
int t;
cin >> t;
int y, m, d, a;
while(t--) {
cin >> y >> m >> d >> a;
a += ToStart(y, m, d);
while(a > 365 + LeapYear(y)) {
a -= (365 + LeapYear(y));
y++;
}
for(int i = 0; i <= 12; i++) {
if(i == 2 && a > (days[i] + LeapYear(y))) a -= (days[i] + LeapYear(y));
else if(i != 2 && a > days[i]) a -= days[i];
else {
printf("%04d-%02d-%02d\n", y, i, a);
break;
}
}
}
return 0;
}