解题思想:把问题统一到特定日期与原点日期的天数差,分别求出两特定日期与原点日期的天数差,在将结果相减,便得到两特定日期天数差
注:1.(能被4整除但不能被100整除)或(能被400整除)的年份为闰年。
2.需要开辟大量内存空间的,必须在函数体外定义,即定义为全局变量,若在函数中会导致栈溢出,例如本题中:Time[5001][13][32]
#include <stdio.h> int isLeapYear(int x){ //判断是否为闰年 if( (x%4==0 && x%100!=0) || x%400==0) return 1; return 0; } //每月的天数,后面为闰年 int dayOfMonth[13][2]={ 0,0, 31,31, 28,29, 31,31, 30,30, 31,31, 30,30, 31,31, 31,31, 30,30, 31,31, 30,30, 31,31, } ; struct Date{ int day; int month; int year; void nextDay(){ day++; if(day > dayOfMonth[month][isLeapYear(year)]){ day = 1; month++; if(month > 12){ month = 1; year++; } } } }; int Time[5001][13][32];//保存天数 int abs(int x){ if(x < 0) return -x; return x; } int main(){ Date time; int cnt=0;//天数计数 time.day=1; time.month=1; time.year=0;//初始日期为0年1月1日 while(time.year!=5001){ Time[time.year][time.month][time.day]=cnt; time.nextDay(); cnt++; } int y1,m1,d1; int y2,m2,d2; while(scanf("%4d%2d%2d",&y1,&m1,&d1) != EOF){ scanf("%4d%2d%2d",&y2,&m2,&d2); int t= abs( Time[y1][m1][d1] - Time[y2][m2][d2])+1; printf("%d ",t); } return 0; }
拓展:求某特定日期是该年的第几天?
思想:该特定日期与原点日期的天数减去该年1月1日与原点日期的天数。