码迷,mamicode.com
首页 > 其他好文 > 详细

日期类问题-日期差值

时间:2018-01-13 14:28:05      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:std   blog   全局   定义   空间   eof   isl   http   include   

技术分享图片

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

注: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\n",t);
    }
    return 0;
}

 

 

 

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

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

 

日期类问题-日期差值

标签:std   blog   全局   定义   空间   eof   isl   http   include   

原文地址:https://www.cnblogs.com/chao-zjj/p/8278729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!