ltx_zero

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

《算法笔记》3.4小节——入门模拟->日期处理

 A日期差值

不难,但是需要非常谨慎

刚开始的时候把想到的问题都列出来了,思路还是比较清晰的

这种情况下出错的几个地方:数组初始值对应平年闰年写反了,isrun传参数的时候,应该传入year手误传入了data

思考过程中认为

  • 从A->B这里面计算A天,B当天不计算
  • 在yearB-yearA>1的时候通过年来叠加,(初始调整固定A<B),到范围内再一个一个加,会更快
  • 那么,假设A闰年B平年,从今年3.2->明年3.1是365,从今年2.28-明年2.27是366,(从这里可以发现从今年2.29-明年2.28是266,直接算容易懵)
  • 因此我们发现,2.29及之前的是根据本年平润,而之后的是根据下一年
  • 在遇到2.29时候,年份叠加判定,如果出现闰年变平年,因为我们实际计算的366天是今年2.29-明年2.28,B代表的是计算的下一天,我们需要修改为3.1
#include<stdio.h>
using namespace std;
int month[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30,31,31,31,31,30,30,31,31,30,30,31,31};
//平年为0,闰年为1
bool isrun(int year)
{
    if((year%4==0 && year%100!=0)||(year%400==0))
        return true;
    else
        return false;
}
int main()
{
    int data1,data2;
    int year1,year2,month1,month2,day1,day2;
    while(scanf("%d",&data1)!=EOF && scanf("%d",&data2)!=EOF)
    {
        if(data2<data1)
        {
            int temp=data2;
            data2=data1;
            data1=temp;
        }
        year1=data1/10000;
        year2=data2/10000;
        data1=data1%10000;
        data2=data2%10000;
        month1=data1/100;
        month2=data2/100;
        day1=data1%100;
        day2=data2%100;
        int sum=1;
        //printf("%d %d\n",data1,data2);
        while(year2-year1>1)
        {
            if(data1<=229)
            {
               // printf("%d is %d\n",year1,isrun(year1));
                if(isrun(year1))
                {
                    sum+=366;
                    if(data1==229)
                    {
                        data1=301;
                        month1=3;
                        day1=1;
                        //printf("haha%d\n",sum);
                    }
                }
                else
                    sum+=365;
            }
            else
            {
                if(isrun(year1+1))
                    sum+=366;
                else
                    sum+=365;
            }
            year1++;
        }
        data1=year1*10000+month1*100+day1;
        data2=year2*10000+month2*100+day2;
        while(year1<year2||month1<month2||day1<day2)
        {
            day1++;
            sum++;
            if(day1>month[month1][isrun(year1)])
            {
                month1++;
                day1=1;
                if(month1>12)
                {
                    month1=1;
                    year1++;
                }
            }
            //printf("%d %d %d\n",year1,month1,day1);
        }
        printf("%d\n",sum);
    }
    return 0;
}
View Code

之前想思路的图贴一下

                        

 

posted on 2019-08-16 23:52  ltx_zero  阅读(107)  评论(0编辑  收藏  举报