Q
date:2025-06-23
include <stdio.h>
int a(int year, int month)
{
if (month == 2)
{
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
return 29; // 闰年二月
else
return 28; // 平年二月
}
else
{
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
return days[month]; // 按数组取天数
}
}
int main()
{
char date[11];
scanf("%s", date);
int year, month, day;
sscanf(date, "%d-%d-%d", &year, &month, &day);
day -= 2;
if (day < 1)
{
month--;
if (month < 1)
{
month = 12;
year--;
}
int b = a(year, month); //a输入的, b前一天的
day += b;
}
printf("%04d-%02d-%02d\n", year, month, day);
return 0;
收获:有很多需要考虑的点递减的时候会跨年,会跨月,每个月有31,30,29,28四种,其中28则是闰年的二月份;把每年的二月单拎出来做if判断 其他的月份则是存储在int数组
如果跨月的话变为上个月的方法是:都减去两天,如果变为负数就是变为上一个月,如果为零则变为上一年的十二月
浙公网安备 33010602011771号