本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。
小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?
做题思路,最开始想的是设置12个月份,然后1,3,5,7,8,10,12设置为31天,2设置为29天或者28天,然后发现有神器的函数库 chrono.
tm 是时间结构体,包含tm_wday,tm_mon,tm_year,tm_wday,在之后的蓝桥杯题中大概率就考这个枚举了,所以先在结构体里面设置年月份。接下来使用time_t转化成1970年以来的秒数,我们使用mktime函数转化即可。然后此时constant expression设置每天的秒数。设置一个int为0 此时设置循环for(time_t xx=起始日期;xx<=结束日期;xx+=oneday),把刚刚的time_t类型的数重新转化成时间结构体,tm* xxx=localtime(&xx); 如果是周一则表示为 xxx->tm_wday==1,月一同是如此xxx->tm_mday==1。然后返回刚刚的总数。
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
// 起始日期 2000-01-01
tm start_tm={};
start_tm.tm_year=2000-1900;
start_tm.tm_mon=0;
start_tm.tm_mday=1; // 日期:1 号
// 结束日期 2020-10-01
tm end_tm = {};
end_tm.tm_year = 2020 - 1900;
end_tm.tm_mon = 9; // 9 表示 10 月
end_tm.tm_mday = 1;
// 转换为 time_t 方便计算
time_t start_time=mktime(&start_tm);
time_t end_time=mktime(&end_tm);
// 一天的秒数
constexpr time_t one_day=24*60*60;
// 记录总跑步距离
int total_distance = 0;
// 遍历日期
for(time_t current_time=start_time;current_time<=end_time;current_time+=one_day){
tm *current_tm=localtime(¤t_time);
if(current_tm->tm_wday==1||current_tm->tm_mday==1){
total_distance+=2;
}else{
total_distance++;
}
}
cout << total_distance << endl;
return 0;
}
根据这道题其实我们不难发现,解决时间类问题 的时候,我们还可以使用 chrono解决 某年星期六是几号或者是,某年几号是星期六。
代码如下,注释也如下。
#include<iostream>
#include<chrono>
using namespace std;
using namespace std::chrono;
int main(){
tm date_1={};
date_1.tm_year=2018-1900;
date_1.tm_mon= 4;
date_1.tm_mday=3;
// 定义时间结构体
time_t date_time=mktime(&date_1);
//转成标准时间
tm *now=localtime(&date_time);//再化为拥有wday的时间结构体
int weekday=now->tm_wday;
cout<< weekday<<endl;
return 0;
}