求任意年,任意天之间的差值

  1. 如果第一年的月日<=2. 28,则需判断这一年是否是闰年
  2. 如果第一年的月日>2.28,则无需判断这一年是否是闰年
  3. 如果最后一年的月份小于2月份,则需判断这一年是否是闰年
  4. 如果最后一年的月份大于等于3月份,则无需判断这一年是否是闰年
  5. 例如2010 1 1-2019 4 1,先计算2010 1 1-2019 1 1的天数d1,在计算2019 1 1-2019 4 1的天数d2,求得天数为:d=d1+d2-1
  6. 例如2010 4 1-2019 1 1,先计算2010 4 1-2019 4 1的天数d1,在计算2019 1 1-2019 4 1的天数d2,求得天数为:d=d1-d2+1

代码如下: 

#include<stdio.h>
int d1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年天数数组
int d2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年天数数组
int judge(int year)//判断是否是闰年
{
    if(year%4==0)
    {
        if(year%100!=0||year%400==0)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}
int compute(int x1,int y1,int z1,int x2,int y2,int z2)//计算同一年的任意两天差值
{
    int day1=0,day2=0,i;
    if(judge(x1))
    {
        for(i=1;i<y1;i++)
            day1=day1+d2[i];
    }
    else
    {
        for(i=1;i<y1;i++)
            day1=day1+d1[i];
    }
    day1=day1+z1;
    if(judge(x2))
    {
        for(i=1;i<y2;i++)
            day2=day2+d2[i];
    }
    else
    {
        for(i=1;i<y2;i++)
            day2=day2+d1[i];
    }
    day2=day2+z2;
    return day2-day1+1;
}
int compute_year(int x1,int y1,int z1,int x2,int y2,int z2)
//计算第一年某天到最后一年某天的天数
{
    int s=0,i;
    if(y1<=2&&z1<=28)//若日期<=2.28,则应考虑该年是否为闰年
    {
       for(i=x1;i<x2;i++)//如第1年为闰年,则应从第1年开始遍历计算天数
       {
           if(judge(i))//若第i年为闰年,天数+366
            s=s+366;
           else        //若第i年不为闰年,天数+365
            s=s+365;
       }
    }
    else                //如第1年不为闰年
    {
        s=s+365;
        for(i=x1+1;i<x2;i++)//则应从第2年开始遍历计算天数
        {
            if(judge(i))   //若第i年为闰年,天数+366
            s=s+366;
           else         //若第i年不为闰年,天数+365
            s=s+365;
        }
    }
    return s;
}
int main()
{
    int x1,y1,z1,x2,y2,z2,d,y;
    while(1)                 //无终止
    {
        scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);//输入年月日
        y=compute_year(x1,y1,z1,x2,y2,z2);
                                     //计算从第1年某日到最后一年某日(2009 9 1-2020 9 1)
        if(x1==x2)//如果为同一年
        {
            d=compute(x1,y1,z1,x2,y2,z2);//则直接计算同年任意两年差值
            printf("%d",d);      //输出结果
        }
        else  //如果为不同年
        {
            if(y1<=y2)//如果第一年月份<=最后一年月份
            {
                d=compute(x1,y1,z1,x2,y2,z2);
                printf("%d",d+y-1);
            }
            else//如果第一年月份>最后一年月份
            {
                d=compute(x2,y2,z2,x1,y1,z1);
                printf("%d",y-d+1);
        }
    }
    printf("\n");
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值