27.【日期】计算后续日期
我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。
输入:
年 月 日
N
输出:
(年月日+N天后的)年.月.日
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int run4_YorN(int);
void main()
{
int y, m, d, N, n, j;
register int i;
scanf("%d %d %d", &y, &m, &d);
scanf("%d", &N);
int run4[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//闰年数组
int ping2[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年数组
n = N + d - 1;//m月d日后N天就等于m月1号后N+d-1天,所以相当于输入y m 1和N+d-1,这种表达更一般
d = 1; //简化问题
for (i = m; i <= 12; i++)
{
switch (run4_YorN(y))
{
case 1:
n = n - run4[i - 1];//扣掉当月的天数以后日期应该来到了下个月的1号,此时1号后n天应该是来到了当月的n+1号
break;
case 0:
n = n - ping2[i - 1];
break;
}
if (n < 0)//n=0意味着什么?意味着日期来到了下个月1号,月份i需要+1,所以此处不能是n<=0
break;
} //做完当年的计算
while (n >= 0)
{
y++;
for (i = 1; i <= 12; i++)
{
switch (run4_YorN(y))
{
case 1:
n = n - run4[i - 1];
break;
case 0:
n = n - ping2[i - 1];
break;
}
if (n <= 0)
break;
}
}
switch (run4_YorN(y))
{
case 1:
j = n + run4[i - 1];
break;
case 0:
j = n + ping2[i - 1];
break;
}
printf("%d.%d.%d\n", y, i, ++j);//相当于i月1日后j天,是i月j+1号
}
int run4_YorN(int y)
{
int x;
if (y % 100 != 0 && y % 4 == 0 || y % 100 == 0 && y % 400 == 0)
x = 1;
else
x = 0;
return x;
}