zoukankan      html  css  js  c++  java
  • 做题记录--day39

    《算法笔记》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
    ",data1,data2);
            while(year2-year1>1)
            {
                if(data1<=229)
                {
                   // printf("%d is %d
    ",year1,isrun(year1));
                    if(isrun(year1))
                    {
                        sum+=366;
                        if(data1==229)
                        {
                            data1=301;
                            month1=3;
                            day1=1;
                            //printf("haha%d
    ",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
    ",year1,month1,day1);
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    View Code

    之前想思路的图贴一下

                            

    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    面试问题 集锦
    减少 lwip 消耗 的 RAM
    Blocking Master Example QT 自带 的 serial 即 串口 例子
    32位 的变量 用于表示 ms ,可以表示多少天那?
    centos 腾讯云 今天买了 18个月
    Linux BLE 基于 树莓派
    树莓派 4G模块 PPP 拨号 NDIS 拨号
    linux备份还原命令
    centos7中/tmp文件保存天数
    centos7查看可登陆用户
  • 原文地址:https://www.cnblogs.com/tingxilin/p/11366926.html
Copyright © 2011-2022 走看看