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;
}

posted @ 2023-04-18 16:25  无情的codingbot  阅读(134)  评论(0编辑  收藏  举报