欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

CSP认证 201503-3节日[C++题解]:模拟、枚举、日期题、日期模板题

发布时间:2025/4/5 c/c++ 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CSP认证 201503-3节日[C++题解]:模拟、枚举、日期题、日期模板题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目分析



来源:acwing

分析:

  • 每月有多少天用数组months[]来存储,下标是1 ~ 12,二月存的是平年28天。另外,星期1到星期日的下标是0~6,起点1850 年 1 月 1 日是星期二,它的下标是1.这样的话,可以用一个变量days来记录,某年某月的第一天到1850年1月1日的天数,然后 mod 7 就可以求出星期几!!!
  • 判断闰年is_leap(),是的话返回1,否则返回0
  • 求某年的某月有多少天get_days_a_month(int year, int month),返回天数。
  • 以上三步是求解日期题目的模板!!!

    下面是具体到本题的思路:

    枚举哪一年,枚举一年中的月份,需要标记每天是星期几,这怎么做呢? 笔者采用的方法是记录该年该月的第一天到1850年1月1日总共过了多少天,用变量days表示,然后days对 7取模,就可以得到星期几。w = (1 + w) % 7; 这里加1是因为起点那天是周二,下标是1(前文讲到过)。

    然后就是枚举,遍历每个月的所有天,找到合法的日期输出。

    ac代码

    #include<bits/stdc++.h> using namespace std; const int N = 210;// 每月有多少天 int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int is_leap(int year){if( year % 400 == 0 || year % 4 == 0 && year % 100 )return 1;return 0; }// 求哪年的每月有多少天 int get_days_a_month(int year, int month){if(month == 2) return months[month] + is_leap(year);return months[month]; }int main(){int a, b, c, y1, y2;cin >> a >> b >> c >> y1 >> y2;int days = 0;for(int year = 1850; year <= y2; year ++){for(int month = 1; month <= 12; month ++){if(year >= y1 && month == a){// w表示该月1号是星期几,cnt 表示当前是第几个星期int w = (1 + days) % 7, cnt = 0;// 枚举该年的所有天,d表示日期for(int d = 1; d <= get_days_a_month(year, month); d ++){// 等于所求的星期几,这里下标从0开始,而不是1,所以c-1if( w == c -1) {cnt ++; // 当前第几个星期if( cnt == b){ // 恰好是所要求的第b个星期,则输出printf("%04d/%02d/%02d\n", year, month, d);break;}}w = (w + 1) % 7; // w不断增加,计算星期几}// 如果没有找到第b个星期,则输出noneif( cnt < b) puts("none");}// 记录某年的某月的1号距离1850年1月1日过了多少天 days += get_days_a_month(year, month);// cout << days << endl;}}}

    题目来源

    https://www.acwing.com/problem/content/3217/

    《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

    总结

    以上是生活随笔为你收集整理的CSP认证 201503-3节日[C++题解]:模拟、枚举、日期题、日期模板题的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。