编程语言
首页 > 编程语言> > C++判断闰年&日期之差

C++判断闰年&日期之差

作者:互联网

判断闰年

地球绕太阳转一周的时间实际是365天5小时48分46秒。算下来,每四年会多出来一天,所以加到那一年的二月。但是这样算,又多算了一点点时间。于是,又规定,整百的年份计算闰年除以400。这样,我们的历法才能最大程度的和地球绕太阳转契合。

总之:非整百年份除以4无余数;整百年份除以400无余数

即:x % 100 != 0 && x % 4 == 0 || x % 400 == 0

计算日期差

思路是,先算出每一天距离0000年1月1日的天数。然后作差计算。

#include <cstdio>
#define IS_LEAP_YEAR(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0  

int dayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct Date {
    int y;
    int m;
    int d;
    void nextDay() {
        d++;
        if (d > dayOfMonth[m]) {
            d = 1;
            m++;
            if (m > 12) {
                m = 1;
                y++;
                if (IS_LEAP_YEAR(y)) {
                    dayOfMonth[2] = 29;
                } else {
                    dayOfMonth[2] = 28;
                }
            }
        } 
    }
};

int date2day[5000][13][32]; // 该数组作用——将特定日期转化距离 0000-01-01 的天数 
int main()
{    
    // 初始化 
    Date tmp = {0, 1, 1};
    int cnt = 1;
    date2day[tmp.y][tmp.m][tmp.d] = cnt++;
    
    while (tmp.y < 5000) {
        tmp.nextDay();
        date2day[tmp.y][tmp.m][tmp.d] = cnt++;
    }
        
    // 计算日期差 
    int y1, m1, d1;
    int y2, m2, d2;    
    scanf("%4d%2d%2d", &y1, &m1, &d1);
    scanf("%4d%2d%2d", &y2, &m2, &d2);
    
    int result = date2day[y1][m1][d1] - date2day[y2][m2][d2];
    if (result < 0) result = -result;
    result ++;
    
    printf("%d\n", result);
    
    return 0;
} 

 

标签:tmp,闰年,int,31,之差,C++,++,result,date2day
来源: https://www.cnblogs.com/xkxf/p/14446765.html