赞
踩
:
时间问题可以说是蓝桥杯,最喜欢考的问题了,因为时间问题不涉及到算法和一些复杂的知识,往往时间复杂度也不是很高,可以很好的考察学生的模拟和枚举思想,这类题目通常也可以巧用excel来帮助我们解决问题。近几年的考试考察难度也在增大。
根据十年的题目考察,这种类型题目有难有简单,简单的甚至可以通过计算机中自带的excel和计算器来算,但是通常来投机取巧可以解决的不多,掌握代码模板多加练习才是王道 。
如果考察到给你对应时间点,让你求差,不要多想就是化成统一的单位,然后求解。
题目:时间显示(2021年省赛)
代码
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- int h,m,s;
- int main()
- {
- LL n;
- cin >> n;
- n= n / 1000 % 86400; // 毫秒化秒,并且保留最后一天天数
- h = n/3600; //求得最后一天的小时
- n = n % 3600;
- m= n / 60; //分钟
- s= n % 60; //秒数
- printf("%02d:%02d:%02d",h,m,s); //02d的意思是如果不足俩位数,前补0
- return 0;
- }
这类题目比较经典的有回文日期和第八届蓝桥杯省赛C++B组的日期问题。这里就讲解一下日期问题这个题目
代码(重点是check_vaild函数里面的内容)
- #include <iostream>
- #include <cstring>
- #include <algorithm>
- #include <cstring>
-
- int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
- bool check_vaild(int year,int month,int day)
- {
- if(month == 0 || month > 12) return false;
- if(day == 0) return false;
- if(month != 2)
- {
- if(day > days[month]) return false;
- }
- else{
- int leap = year % 100 && year % 4 == 0 ||year % 400 == 0;
- if(day > leap + 28) return false;
- }
- return true;
- }
- using namespace std;
- int main()
- {
- int a,b,c;
- scanf("%d/%d/%d",&a,&b,&c);
- for(int date = 19600101;date <= 20591231;date ++)
- {
- int year = date / 10000;
- int month = date % 10000 / 100;
- int day = date % 100;
- if(check_vaild(year,month,day))
- {
- if(year % 100 == a && month == b && day == c || // 年月日
- month == a && day == b && year % 100 == c || // 月日年
- day == a && month == b && year % 100 == c) // 日月年
- printf("%d-%02d-%02d\n",year,month,day);
- }
- }
-
- }
这类题型要么是给你俩段时间,让你求过去了多场时间,第二种就是给你一段时间,求一段时间后日期是什么时候。
这种问题,特别是求一段时间是多久,虽然可以通过电脑中的计算器,算出来,但是往往考察不会这么简单,所掌握编程方法至关重要。
题目(2020省赛)
代码
- #include <bits/stdc++.h>
- using namespace std;
- int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
- // 2000/01/01 -- 2020/10/01;
- int main()
- {
- int year = 2000, month = 1,day = 1 ;
- int week = 6;
- int cnt = 0;
- while(true)
- {
- cnt ++;
- if(week == 1 || day == 1)
- {
- cnt ++;
- }
- if(year == 2020 && day == 1 && month == 10) break;
- day += 1;
- week = (week + 1) % 7;
- if (month == 2 && (year % 4 == 0 && year % 100|| year % 400 == 0))
- {
- if(day > 29)
- {
- month = 3;
- day = 1;
- }
- }
- else if(day > months[month] && month != 12)
- {
- day = 1;
- month ++;
- }
- else if(day > months[month] && month == 12)
- {
- day = 1;
- month = 1;
- year ++;
- }
-
- }
- cout << cnt << endl;
-
-
- }
在13年省赛就考到了类似的用法
这里除了简单的可以通过excel和计算器求,往往会遇到日期太久了,这里有个给定日期吗,专门·计算是星期几的方法——“基姆拉尔森计算公式”
if(month<=2) month+=12,year--;
week = (year + year/4 + year/400 -year/100+2*month+3*(month+1)/5+day)%7;周一到周六对应week的值为0 - 6
题目
代码
- #include <bits/stdc++.h>
- using namespace std;
- int main()
- {
- int y,m = 12,d = 31,w;
- for(int i = 10;i <= 99;i ++)
- {
- y = i * 100 + 99;
- w = (y+y/4+y/400-y/100+2*m+3*(m+1)/5+d)%7;
- if(w == 6){
- cout << y << endl;
- }
- }
- return 0;
-
- }
- //我这里直接遍历所有满足条件的日期,最后自己观察那个符合题目,本身要求就是一个填空题,省点力气了哈
- //最终2299满足条件
距离蓝桥杯还有俩个星期,之前更新的文章已经有俩期了,感谢大家的支持,我会继续更新蓝桥杯知识的总结,希望大家都能在蓝桥杯中取得好成绩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。