计算后续日期

        我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。

        鉴于我的解法和我同学(ss)的解法相类似(看了大佬的代码之后恍然大悟),我就打算将我们的思路整合,写下我们的思路。

        算法思路如下:

        大前提是根据是否是闰年,创建一个数组,存放每个月的日期,方便后续的日期调整;

        其次对于进月和进年,需要细分数据的计数零点,从零月开始还是一月开始;

        最后就是数据的最终调整和输出。

判断是否是闰年的方法在之前的文章里面也出现过,这里就不细说:

bool iffrun(int n)    
{    
    if((n%4==0&&n%100!=0)||n%400==0)    
    {    
        return true;    
    }    
    return false;    
}  

算法主体如下:

        优先考虑对月份的进位,先对日进行重置,将多出来的天数加到预加的天数中:

这里创建一个数组来存放年月日,n存放预加的天数。

    int a[3],n;  
    scanf("%d%d%d%d",a,a+1,a+2,&n);  
    n+=a[2]-1;  
    a[2]=1; 

        对于闰年和平年每个月的日期,这里创建两个数组分别存储,调用时直接访问数组下标:

    int q1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};  
    int q2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};  

        在符合条件的情况下调整年和月,这里之所以可以直接调整到日输出,与先前预先重置日相关:

    while(1)  
    {  
        if(!iffrun(a[0]))    // 平年
        {
            for(;a[1]<13;a[1]++)  
            {  
                if(n-q1[a[1]]>=0)    // 大于一个月,调整剩下的天数 
                {  
                    n-=q1[a[1]];  
                }  
                else     // 剩下的日子不足一个月,直接加到日输出
                {  
                    a[2]=a[2]+n;  
                    printf("%d.%d.%d\n",a[0],a[1],a[2]);  
                    return 0;  
                }  
            }  
            a[1]=0;  
        }  
        else              // 闰年
        {  
            for(;a[1]<13;a[1]++)  
            {  
                if(n-q2[a[1]]>=0)  
                {  
                    n-=q2[a[1]];  
                }  
                else  
                {  
                    a[2]=a[2]+n;  
                    printf("%d.%d.%d\n",a[0],a[1],a[2]);  
                    return 0;  
                }  
            }  
            a[1]=0;    // 由于每次进循环总要进for循环调整月,所以这里从0开始计数 
        }  
        a[0]++;     // 月份大于12,年进一
    }  

总结:

        本题中规中矩,是没太多需要排雷的点的题目

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值