个人主页 : zxctscl 如有转载请先通知
日期之间比较可能会出现给的两个年月日都不相同,这个就不好作差,每个月给的天数不同,还有可以是闰年,得先判断一下是不是闰年,这里就写一个判断闰年的函数:
因为每个月的日期不一样,可以写一个获取每个月日期的函数,只是在2月份的时候,闰年就返回29,平年就是28。
考虑到输入的时候日期大小的顺序可能是不相同的,那么就统一设置一下,1的输入的日期都比2的大,这里就写一个判断日期大小的函数: 先比较年,年如果相同就比较月,月如果相同就比较日,如果1的都大于2的就是正确,否则就返回false。
在写main时候,得注意输入,题目要求的是年月日相连直接输入,在写输入的时候得注意格式scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2) != EOF
。
再将日期统一为1的都大于2,不同就交换,这里也是提起写了交换函数:
当年月都相同时候,日期直接相减就能得到相差的日期,顾在写判断的时候就写为 while (!((y1 == y2) && (m1 == m2)))
,把m1月份先减来同m2一样,如果等于0了,m1月份就设置为12,同时年份得减1,把每一次m1–的对应的日期都加起来:
循环结束时候1的年月与2的年月是一样的,这时候直接让d1 - d2,就是在相同年月下的差值,再加上之前的sum就是相差的日期。但是得注意题目写了日期相差得多一天,所以这里在最后的加上1。
与日期有关的计算就必须得区别闰年与平年的2月份,同样先写一个获取每个月对应的日期: 如果是闰年那么就返回29。
这里既然已经有给定与已经给的日期相差的天数,那么不如直接将个的d也加上sum = sum + d;
,这样的话就好凑整月。如果这个月对应的日期满了,那么就直接让sum减去对应月份的天数,再m++,注意顺序:
但是这里得注意循环条件sum必须大于所对应的月份才能进入循环:while (sum > GetMonthDay(y, m))
。
在循环中得考虑,当m>12时候,这是,年份就得加1,而月份就调整为0:
最后出了循环,再把d = sum;
就可以了。
注意题目给的要求,输出的日期格式:printf("%04d-%02d-%02d\n", y, m, d)
有问题请指出,大家一起进步!!!