题解 | 日期累加
日期累加
https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d
#include <stdio.h>
//难点在于:1 闰年判断(4,100x;400) 2 年月日进制转换 3 改变后重新判断闰年和相应计算
int n[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int r[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//闰年
int main() {
int m;
scanf("%d", &m);
for (int case_num = 0; case_num < m; case_num++) { // 修复变量名冲突
int y, mo, d, b,t=0;
scanf("%d%d%d%d", &y, &mo, &d, &b);
b += d;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { // 闰年
int current_month = mo; // 引入新变量表示当前月份
while (b > 0) {
if (current_month > 12) {//年变
current_month = 1;
y++;
t=1;
}
int days_in_month = r[current_month]; // 使用闰年数组
if(t)//注意年份改变后,判断是否为闰年
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
days_in_month = r[current_month];
else days_in_month = n[current_month];
}
if (b <= days_in_month) {
d = b;
mo = current_month;
printf("%04d-%02d-%02d\n", y, mo, d);
break;
} else {
b -= days_in_month;
current_month++;
}
}
} else { // 平年
int current_month = mo;
while (b > 0) {
if (current_month > 12) {
current_month = 1;
y++;
t=1;
}
int days_in_month = n[current_month]; // 使用平年数组
if(t)
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
days_in_month = r[current_month];
else days_in_month = n[current_month];
}
if (b <= days_in_month) {
d = b;
mo = current_month;
printf("%04d-%02d-%02d\n", y, mo, d);
break;
} else {
b -= days_in_month;
current_month++;
}
}
}
}
return 0;
}
