蓝桥杯C++枚举日期题:跑步锻炼身体

题目:小mao每天都锻炼身体

正常情况下,小mao每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小mao要跑 2 千米。如果同时是周一或月初,小mao也是跑 2 千米。小mao跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小mao总共跑步多少千米?

c++小mao每天都锻炼身体
c++小mao每天都锻炼身体

解题思路:

本题使用的知识点为 日期枚举,涉及组别为第 11 届蓝桥杯软件类 C/C++ B/C 组、Java C 组和 Python 组。

这是一道简单模拟题,主要需要解决两个问题:

是否是月初

是否是周天

我们可以枚举从 2000 年 1 月 1 日到 2020 年 10 月 1 日的所有日期:用 y、m、d 分表表示当前枚举的年、月、日,那么当 d=1 为月初,否则不为月初,问题一解决。

同时我们可以定义 week 表示当前日期所对应的星期,这样下一个日期所对应的星期就为 (week+1)%7。那么当 week=1 时为周一,否则不为周一,问题二解决。最后模拟一下即可(注意判断闰年),答案为 8879。

代码如下:

include

using namespace std;
int D[13];
bool check(int y){
if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) return true;
return false;
}
signed main()
{
D[1] = 31 , D[2] = 28 , D[3] = 31 , D[4] = 30 , D[5] = 31 , D[6] = 30;
D[7] = 31 , D[8] = 31 , D[9] = 30 , D[10] = 31 , D[11] = 30 , D[12] = 31;
int ans = 0 , week = 6;
for(int y = 2000 ; y <= 2020 ; y ++){
if(check(y)) D[2] = 29;
else D[2] = 28;
for(int m = 1 ; m <= (y == 2020 ? 10 : 12) ; m ++){
if(y == 2020 && m == 10) D[m] = 1;
for(int d = 1 ; d <= D[m] ; d ++){
if(week == 1 || d == 1) ans += 2;
else ans += 1;
week = (week + 1) % 7;
}
}
}
cout << ans << ‘\n’;
return 0;
}

最后更新时间:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

上一篇2022-09-28 10:00:00
下一篇 2022-09-29 10:14:42

相关推荐