日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2025/4/5 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP认证 201503-3节日[C++题解]:模拟、枚举、日期题、日期模板题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目分析



來源:acwing

分析:

  • 每月有多少天用數(shù)組months[]來存儲,下標是1 ~ 12,二月存的是平年28天。另外,星期1到星期日的下標是0~6,起點1850 年 1 月 1 日是星期二,它的下標是1.這樣的話,可以用一個變量days來記錄,某年某月的第一天到1850年1月1日的天數(shù),然后 mod 7 就可以求出星期幾!!!
  • 判斷閏年is_leap(),是的話返回1,否則返回0
  • 求某年的某月有多少天get_days_a_month(int year, int month),返回天數(shù)。
  • 以上三步是求解日期題目的模板!!!

    下面是具體到本題的思路:

    枚舉哪一年,枚舉一年中的月份,需要標記每天是星期幾,這怎么做呢? 筆者采用的方法是記錄該年該月的第一天到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/

    《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的CSP认证 201503-3节日[C++题解]:模拟、枚举、日期题、日期模板题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。