【蓝桥杯冲刺】日期类专题特训

简介: 【蓝桥杯冲刺】日期类专题特训

1. 日期累加

题目链接:日期累加


题目描述


输入

1

2008 2 3 100

输出

2008-05-13

代码

#include 
using namespace std;
//打表
int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
//取当月日期
int get_mday(int year, int mon) {
    if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
    else return month[mon];
}
//具体实现
void plus_day(int& year, int& mon, int& day, int plus) {
    day += plus;
    while (day > get_mday(year, mon)) {
        int mday = get_mday(year, mon);
        if(day > mday) {
            day -= mday;
            mon++;
        }
        if(mon > 12) {
            mon -= 12;
            year++;
        }
    }
}
int main() 
{
    int n;
    cin >> n;
    while(n--) {
        int year, mon, day, plus;
        cin >> year >> mon >> day >> plus;
        //将日期加在一起
        plus_day(year, mon, day, plus);
        printf("%02d-%02d-%02d\n", year, mon, day);
    }
    return 0;
}

2. 日期差值

题目链接:日期差值


题目描述


输入

20110412

20110422

输出

11

代码

#include 
using namespace std;
//打表
int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
//判断闰年
bool is_leap(int year) {
    if((year % 4 == 0 && year % 100) || year % 400 == 0) return true;
    else return false;
}
int main() 
{
    int n1, n2;
    while (cin >> n1 >> n2) {
        //保证之后的代码时小的日期减大的日期
        if(n1 > n2) swap(n1, n2);
        else if(n1 == n2) {
            cout << 2 <
            return 0;
        }
        //取出年月日
        int year1 = n1 / 10000, year2 = n2 / 10000;
        int mon1 = n1 / 100 % 100, mon2 = n2 / 100 % 100;
        int day1 = n1 % 100, day2 = n2 % 100;
        int ans = 0;
        //年份差了几天
        while(year1 != year2) {
            if(is_leap(year1)) ans += 366;
            else ans += 365;
            year1++;
        }
        //月份差了几天
        while(mon1 != mon2) {
            if(mon1 < mon2) {
                if(mon1 == 2 && is_leap(year1)) ans += month[mon1] + 1;
                else ans += month[mon1];
                mon1++;
            }
            else {
                if(mon1 == 2 && is_leap(year1)) ans -= month[mon1] + 1;
                else ans -= month[mon1];
            }
        }
        //日期差了几天
        if(day1 < day2) {
            ans += day2 - day1;
        }
        else {
            ans -= day1 - day2;
        }
        cout << ans + 1 << endl;
    }
    return 0;
}

3. 打印日期

题目链接:打印日期


题目描述

输入

2000 3
2000 31
2000 40
2000 60
2000 61
2001 60

输出

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

代码

#include 
using namespace std;
//打表
int month[] = {0, 31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31};
//求当月日期
int get_mday(int year, int mon) {
    if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
    else return month[mon];
}
int main() 
{
    int year, day;
    while (cin >> year >> day) {
        int mon = 1;
        while (day > get_mday(year, mon)) {
            day -= get_mday(year, mon);
            mon++;
            if(mon > 12) {
                mon -= 12;
                year++;
            }
        }
        printf("%02d-%02d-%02d\n", year, mon, day);
    }
    return 0;
}

总结:

日期类的题目大同小异,


把日期类的基本思路练熟了,基本上是能够稳拿这一部分的分数的,


如果你的日期类还不熟练,赶快拿上面几道题练一练手吧!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。


之后我还会输出更多高质量内容,欢迎收看。  


相关文章
|
6天前
|
C++
第十三届蓝桥杯B组C++(试题B:顺子日期)
第十三届蓝桥杯B组C++(试题B:顺子日期)
53 0
|
10月前
|
测试技术
【蓝桥杯冲刺】蓝桥杯13届省赛C++b组真题-A~E题
【蓝桥杯冲刺】蓝桥杯13届省赛C++b组真题-A~E题
116 0
|
10月前
|
存储
【蓝桥杯冲刺】蓝桥杯12届省赛C++b组真题-填空题
【蓝桥杯冲刺】蓝桥杯12届省赛C++b组真题-填空题
72 1
|
10月前
|
人工智能 测试技术 BI
【蓝桥杯冲刺】蓝桥杯11届省赛C++b组真题-编程题
【蓝桥杯冲刺】蓝桥杯11届省赛C++b组真题-编程题
78 0
|
10月前
【蓝桥杯冲刺】蓝桥杯11届省赛C++b组真题-填空题
【蓝桥杯冲刺】蓝桥杯11届省赛C++b组真题-填空题
99 0
|
10月前
|
人工智能 测试技术
【蓝桥杯冲刺】蓝桥杯12届省赛C++b组真题-编程题
【蓝桥杯冲刺】蓝桥杯12届省赛C++b组真题-编程题
66 0
|
11月前
|
机器学习/深度学习 存储 测试技术
蓝桥杯冲刺-倒数第八天-省赛题
蓝桥杯冲刺-倒数第八天-省赛题
94 0
|
11月前
|
C++
第十一届蓝桥杯省赛 C++ B组 - 回文日期
第十一届蓝桥杯省赛 C++ B组 - 回文日期
60 0
|
11月前
|
机器学习/深度学习 测试技术
[蓝桥杯 2020 省 AB2] 回文日期
[蓝桥杯 2020 省 AB2] 回文日期
72 0
|
11月前
[蓝桥杯 2017 省 B] 日期问题
[蓝桥杯 2017 省 B] 日期问题
76 0