【蓝桥杯】日期类问题详解

目录

1 判断某年是否是闰年

2 求指定日期是星期几

3 求日期A到日期B有多少天


1 判断某年是否是闰年

       日期类问题常常涉及对闰年的判断:年份是4的倍数的,一般都是闰年;但年份是整百数的,必须是400的倍数才是闰年。

bool run(int y){
    return (y%100 && y%4 == 0)||(y%400==0);
}

有了闰年的判断方法,我们才可以进一步解决日期类问题。

2 求指定日期是星期几

        第一种方法是死记硬背的公式(不大推荐这种方法,个人推荐第二种方法!!!)——基姆拉尔森计算公式:对于 y 年 m 月 d 日,有:

int fun(int y,int m,int d)
{
    int w;
    if(m<=2)    m += 12,y--;
    w = (y + y/4 + y/400 - y/100 + 2*m + 3*(m+1)/5 +d)%7;
    return w;
}
// 其中,w的值为[0,6],分别对应星期一到星期日,即0表示星期一,6表示星期日。

        第二种是一个比较好记忆、适用范围更广的方法:从公元1年1月1日,到给定日期,一共有多少天,然后总天数取模7即可。注意:1~6代表星期一到六,0代表星期

int mouth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool run(int y){
    return (y%100 && y%4 == 0)||(y%400==0);
}

int howmany(int y,int m,int d){
    int ret = 0;
    for(int i = 1;i

3 求日期A到日期B有多少天

        我们当然可以对日期A进行累加,统计从A到B一共要加多少次,但日期进行加减有很多细节要注意,一不留神可能就要debug了。我们可以借助前面提到的方法,计算出两个日期各有多少天,再做差。

// 日期A:y1,m1,d1
// 日期B:y2,m2,d2
printf("%d\n",howmany(y2,m2,d2)-howmany(y1,m1,d1));

你可能感兴趣的:(蓝桥杯,c++,蓝桥杯)