注意 : 给定天数最大为365
#include
int date_map(int month, int sum);
int main()
{
int i;
int year, month, day;
int days;
int sum;
printf("Please input year month day days : ");
scanf("%d %d %d %d:", &year, &month, &day, &days);
// 计算今年开始到现在的天数
sum = date_map(month, -1) + day;
if (year%400 == 0 || (year%100 != 0 && year%4 == 0))
{
if (month > 2) sum++;
}
printf("The before of %d day is : ", days);
// 天数(days)小于今年开始到现在的天数(sum)
if (days < sum)
{
if (days < day)
{
// 天数(days)小于当前月份的天数(day)
printf("year:%d, month:%d, day:%d\n", year, month, (day-days));
} else {
// 天数大于当前月份的天数(day)小于今年开始到现在的天数(sum)
i = sum - days;
month = date_map(-1, i);
printf("year:%d, month:%d, day:%d\n", year, month, (i - date_map(month, -1)));
}
} else {
// 天数(days)大于今年开始到现在的天数(sum)
i = 365 - days + sum;
month = date_map(-1, i);
//if (month == 12) i--;
printf("year:%d, month:%d, day:%d\n", (year - 1), month, (i - date_map(month, -1)));
}
return 0;
}
int date_map(int month, int sum_t)
{
switch(month)
{
case 1: sum_t = 0; break;
case 2: sum_t = 31; break;
case 3: sum_t = 59; break;
case 4: sum_t = 90; break;
case 5: sum_t = 120; break;
case 6: sum_t = 151; break;
case 7: sum_t = 181; break;
case 8: sum_t = 212; break;
case 9: sum_t = 243; break;
case 10: sum_t = 273; break;
case 11: sum_t = 304; break;
case 12: sum_t = 334; break;
default: break;
}
if (month != -1) return sum_t;
if (month == -1)
{
do{
switch(sum_t)
{
case 0: month = 1; break;
case 31: month = 2; break;
case 59: month = 3; break;
case 90: month = 4; break;
case 120: month = 5; break;
case 151: month = 6; break;
case 181: month = 7; break;
case 212: month = 8; break;
case 243: month = 9; break;
case 273: month = 10; break;
case 304: month = 11; break;
case 334: month = 12; break;
default: break;
}
if (month != -1) break;
}while(sum_t--);
}
if (sum_t != -1) return month;
}
运行结果
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 5 21 6
The before of 6 day is : year:2020, month:5, day:15
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 5 21 141
The before of 141 day is : year:2020, month:1, day:1
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 5 21 142
The before of 142 day is : year:2019, month:12, day:31
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 5 21 325
The before of 325 day is : year:2019, month:7, day:1
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 1 1 8
The before of 8 day is : year:2019, month:12, day:24
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 1 8 8
The before of 8 day is : year:2019, month:12, day:31
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 1 1 365
The before of 365 day is : year:2019, month:1, day:1
necasroot@necasroot:~/code/tmp$ vim year.c
necasroot@necasroot:~/code/tmp$ ./year
Please input year month day days : 2020 2 29 365
The before of 365 day is : year:2019, month:3, day:1
necasroot@necasroot:~/code/tmp$