zoukankan      html  css  js  c++  java
  • 日期类问题-日期差值

    解题思想:把问题统一到特定日期与原点日期的天数差,分别求出两特定日期与原点日期的天数差,在将结果相减,便得到两特定日期天数差

    注:1.(能被4整除但不能被100整除)或(能被400整除)的年份为闰年。

    2.需要开辟大量内存空间的,必须在函数体外定义,即定义为全局变量,若在函数中会导致栈溢出,例如本题中:Time[5001][13][32]

    #include <stdio.h>
    
    int isLeapYear(int x){    //判断是否为闰年
        if( (x%4==0 && x%100!=0) || x%400==0)
            return 1;
        return 0;     
    }
    //每月的天数,后面为闰年 
    int dayOfMonth[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,
    } ;
    
    struct Date{
        int day;
        int month;
        int year;
        
        void nextDay(){
            day++;
            if(day > dayOfMonth[month][isLeapYear(year)]){
                day = 1;
                month++;
                if(month > 12){
                    month = 1;
                    year++;
                }
            }
        }
    }; 
    int Time[5001][13][32];//保存天数
    int abs(int x){
        if(x < 0) return -x;
        return x;
    }
    
    int main(){
        Date time;
        int cnt=0;//天数计数 
        time.day=1;
        time.month=1;
        time.year=0;//初始日期为0年1月1日
        while(time.year!=5001){
            Time[time.year][time.month][time.day]=cnt;
            time.nextDay();
            cnt++;
        } 
        int y1,m1,d1;
        int y2,m2,d2;
        while(scanf("%4d%2d%2d",&y1,&m1,&d1) != EOF){
            scanf("%4d%2d%2d",&y2,&m2,&d2);
            int t= abs( Time[y1][m1][d1] - Time[y2][m2][d2])+1;
            printf("%d
    ",t);
        }
        return 0;
    }

    拓展:求某特定日期是该年的第几天?

    思想:该特定日期与原点日期的天数减去该年1月1日与原点日期的天数。

  • 相关阅读:
    计算一个未排序数组中排序后相邻元素的最大差值
    13 类对象的声明中加小括号{}和不加小括号{}的区别
    12 表中删除重复项
    11 常量区的内容不能被修改
    10 无向图的边
    顺时针旋转矩阵
    字符串的旋转
    动态规划算法
    贪心算法应用-最小生成树
    贪心算法应用-单元最短路径
  • 原文地址:https://www.cnblogs.com/chao-zjj/p/8278729.html
Copyright © 2011-2022 走看看