蓝桥杯-时间模拟
引言:时间模拟,是蓝桥杯最常见的题型,我愿意把他称作小白和入门画的界限,接下来就让我来带大家入门把!
一、模板
# include<bits/stdc++.h> // 万能头文件
using namespace std;
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 12个月份,存13个数是为了,让下标1,指向的就是一月,放弃下标0,容易理解点,你喜欢也可以存12个数,下标从0~11
int main(){
int year = 2020, month = 1, day = 1;//初始年、月日
while(1){
if(year == 2025 && month == 1 && day == 1){
break;
}
cout << year << '\t' << month << '\t' << day << endl;//输出年、月、日
day++;
if(month == 2 && (year % 4 == 0 && year % 100 !=0) || year % 400 == 0){//是二月且是闰年
if(day > a[month] + 1){
day =1;
month++;
}
}
else if(day > a[month]){
day =1;
month++;
}
if(month > 12){
month = 1;
year++;
}
}
}
这里的结果,可自行打印
套路整理:
- 开辟一个数组存12个月份的天数
这里我的记忆方式是,1、3、5、7、 、8、10、12 前奇数后偶数,二月是28天
-
接下来是就是while循环里的操作了,
- 结束条件
- 月份进位——每四年一轮的闰年,二月会多一天
闰年的判断,能被4整除,但是不能被100整除,或者能被400整除就是闰年了,
* 年份进位
二、小试牛刀
蓝桥杯2018c/c++b组——第几天
题目:
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?
直接套模板结束!
#include <bits/stdc++.h>
using namespace std;
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(){
int year = 2020, month = 1, day = 1, ans = 0;
while (1){
ans++;
if (year == 2020 && month == 5 && day == 4){
break;
}
if (((year % 4 == 0 && year % 100 != 0) || year % 400) && month == 2){
if (day > a[month] + 1){
day = 1;
month++;
}
}
else {
if(day > a[month]){
day = 1;
month++;
}
}
if (month > 12){
month = 1;
year++;
}
// cout << year << '\t' << month << '\t' << day << endl;
day++;
}
cout << ans;
}
三、进阶实验
引言:有时我们需要对年月日,进行一并处理,但是问题就是,我们的变量是year、month、day平常的日期可以表达,但是有些特殊格式却表达不出,举个栗子:20200101,用year、month、day表示是202011,会有差别,那么接下来就来进阶学会!
我们用c语言中的函数来进行
-
头文件#include <stdio.h>
-
内置函数:sprintf
标准格式:int sprintf(char *str, const char *format, …)
举个栗子
蓝桥杯2022c/c++b组——顺子日期
题目:
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的yyyymmdd表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了一个顺子:123;而20221023则不是一个顺子日期,它一个顺子也没有。小明想知道在整个2022年份中,一共有多少个顺子日期。
题解:
#include <bits/stdc++.h>
using namespace std;
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char k[10];
bool check(char k[]){
int l = 8;
for (int i = 0; i < l-2; i++){
if (k[i] == k[i + 1] - 1 && k[i + 1] == k[i + 2] - 1){
// cout << k << '\t' << k[i] << k[i+1] << k[i + 2] << endl;
return true;
}
}
return false;
}
int main(){
int year = 2020, month = 1, day = 1, ans = 0;
while(1){
sprintf(k, "%04d%02d%02d", year, month, day);//%02d意思是不足4位补0
//举个栗子:3 他的形式是03的形式保存到字符数组k中,如果是126的话,还是以126的形式保存到字符数组中
if(check(k)){
ans++;
}
cout << year <<" "<< month <<" "<< day << endl;
if(year == 2025 && month == 1 && day == 1){
break;
}
day++;
if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){
if (day > a[month] + 1){
day = 1;
month++;
}
}
else if(day > a[month]){
day = 1;
month++;
}
if(month > 12){
month = 1;
year++;
}
}
cout << ans;
}
以上就是本次全部内容,如有不懂请留言!后续如果各位喜欢本类型的题,我也会出双指针与日期结合的题