题目
描述:
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
题解
直接简单的思路:首先累加的天数(days)减去当前月份剩余天数(months[month]-day),若差值小于零,则月份不变,日期(day)加上累加天数(days)即所求日期;若插值大于零,则月份(month)加一,用差值减去该月份天数,不断循环,直到差值小于零跳出循环,差值加上当前月份天数即为所求日期。需要注意的是,循环过程中月份可能会大于12,此时年份(year)需要加一,并且月份重置为1;年份变化时,还需要再次判断是否为闰年,若为闰年二月份天数改为29,否则改为28(如果没有改为28,当年份为闰年且加上若干天后变为平年时,在进入循环之前二月份天数被改为29,在while循环体内判断为平年,此时二月份天数仍为29,是错误的)。
#include <stdio.h> int main() { int m = 0; scanf("%d\n",&m); int year = 0,month = 0,day = 0,days = 0; int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf("%d %d %d %d\n",&year,&month,&day,&days) != EOF) { if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) months[2] = 29; days -= months[month] - day; while(days > 0) { month++; if(month > 12) { year++; month = 1; } if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) { months[2] = 29; } else { months[2] = 28; } days -= months[month]; } day = months[month] + days; printf("%d-%02d-%02d\n",year,month,day); } return 0; }
另一种思路:通过给定的年、月、日算出这一天是该年的第几天,然后将该天数加上给定的数值,反向求解,得出年、月、日。