蓝桥杯 --- 日期问题模板

打印 上一主题 下一主题

主题 1784|帖子 1784|积分 5352

目次
1.如何判定闰年
2.如何遍历当前年份的每一天
3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。
4.准确到具体周几到周几的问题分析
5.如何直接通过一层for循环枚举年月日
习题:


蓝桥杯角逐特殊喜欢考日期问题,今天给大家分享一下日期题的一些解题模板。
1.如何判定闰年

  1. bool judge(int year)
  2. {
  3.         if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0)
  4.             return true;
  5.         else  return false;
  6. }
复制代码
2.如何遍历当前年份的每一天

首先判定是否为闰年,其次定义一个数组来存储每个月份最多有多少天,并根据是否为闰年进行修改。
  1. #include <iostream>using namespace std;bool judge(int year)
  2. {
  3.         if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0)
  4.             return true;
  5.         else  return false;
  6. }        int data[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};int main(){        int year;        cin >> year;        if(judge(year))            data[2] = 29;                for(int month = 1;month <= 12;month++)        {                for(int day = 1;day <= data[month];day++)                {                        //加入判定条件(根据题意来分析)                        //....                }        }        return 0;}
复制代码
3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。

如果想计算1921-07-23十二点 ~ 2020-07-01十二点之间共有多少天?
先将整年的加和,然后加零散的月份及天数。
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 1000;
  4. int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  5. int time;
  6. int judge(int year)
  7. {
  8.         if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  9.             return 366;
  10.         return 365;
  11. }
  12. //1921-07-23 ~ 2020-07-01
  13. int main()
  14. {
  15.         for(int i = 1922;i <= 2019;i++)
  16.         {
  17.                 time += judge(i);
  18.         }
  19.         time += 10;
  20.         for(int i = 1;i <= 12;i++)//这里因为七月份不完整,所以不单独计算
  21.         {
  22.                 if(i == 7)  continue;//也可以直接自己算出除了七月的剩余天数,可以减少时间浪费
  23.                 time += day[i];
  24.         }
  25.             
  26.         cout << time << ' ';
  27.         cout << time * 24 * 60;//输出共有多少秒
  28.         return 0;
  29. }
复制代码

4.准确到具体周几到周几的问题分析

这里给大家带来蓝桥杯省赛---跑步练习

 对于星期问题,我们可以通过先设定开始星期mon = 6,然后再循环内部加入判定条件
  1. if(mon == 8)  mon = 1;//如果mon++使mon到星期八,这时候让mon赋值为星期一
  2. if(mon == 1 && data == 1)  sum += 2;//月初需要跑2km
  3. else if(mon == 1 || data == 1)  sum += 2;//周一或者月初需要跑2km
  4. else  sum += 1;                       
  5. if(i == 2020 && month == 10 && data == 1)//到达指定日期,直接输出并直接结束循环
  6. {
  7.         cout << sum;
  8.         return 0;
  9. }
  10. mon++;
复制代码
上面是判定星期的方式,无非就是注意星期八改成星期一,其他的部分照常使用年月日三重循环进行枚举 
  1. #include <iostream>
  2. using namespace std;
  3. //2000-01-01(Saturday) ~ 2020-10-01(Thurday),其中某天周一或者月初(1日)要跑2km,其余时间跑1km
  4. int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  5. bool judge(int year)
  6. {
  7.         if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  8.             return true;
  9.         return false;
  10. }
  11. int main()
  12. {
  13.     int sum = 0;
  14.     int mon = 6;
  15.         for(int i = 2000;i <= 2020;i++)
  16.         {
  17.                 if(judge(i))  day[2] = 29;
  18.                 else  day[2] = 28;
  19.                 for(int month = 1;month <= 12;month++)
  20.                 {
  21.                         for(int data = 1;data <= day[month];data++)
  22.                         {
  23.                                 if(mon == 8)  mon = 1;
  24.                                
  25.                                 if(mon == 1 && data == 1)  sum += 2;
  26.                                 else if(mon == 1 || data == 1)  sum += 2;
  27.                                 else  sum += 1;
  28.                                
  29.                                 if(i == 2020 && month == 10 && data == 1)
  30.                                 {
  31.                                         cout << sum;
  32.                                         return 0;
  33.                                 }
  34.                                 mon++;
  35.                         }
  36.                 }
  37.         }
  38. }
复制代码
5.如何直接通过一层for循环枚举年月日

这里就必要除法的运算:
  1. for(int i = 19491001;i <= 20240413;i++)
  2. {
  3.     int year = i / 10000;
  4.     int month = i % 10000 / 100;//也可以这样写:int month = i / 100 % 100;
  5.     int day = i % 100;
  6.     //...
  7. }
复制代码

习题:

这里给大家带来的是蓝桥杯C++B组题---日期统计

很显着,这题咱们只必要使用遍历月日,然后在其内部加入循环遍历数组找到其相同的日期。
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 1000;
  4. int main()
  5. {
  6.     int array[100] = {
  7.                         5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
  8.                         5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
  9.                         2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
  10.                         8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
  11.                         1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3
  12.                     };
  13.     int daymonth[13] = {0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31};          
  14.     int res = 0;
  15.         for(int month = 1;month <= 12;month++)
  16.         {
  17.                 for(int day = 1;day <= daymonth[month];day++)
  18.                 {
  19.                         int time[8] = {2 , 0 , 2 , 3 , month / 10 , month % 10 , day / 10 , day % 10};//这里可以利用数组记录当前枚举的年月日,以便于后面便利100数组找到相同日期
  20.                         int a = 0;
  21.                         for(int k = 0;k < 100;k++)
  22.                         {
  23.                                 if(array[k] == time[a])
  24.                                 {
  25.                                         a++;
  26.                                 }
  27.                                 if(a == 8)
  28.                                 {
  29.                                         res++;
  30.                                         break;
  31.                                 }   
  32.                         }
  33.                 }
  34.         }
  35.         cout << res << endl;
  36.         return 0;
  37. }
复制代码
 好了,以上是我现已做过蓝桥杯有关日期问题的一些解题技巧,接待各位大佬分享自己的一些解题方法,感谢收看,记得三连支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表