<>蓝桥杯-时间模拟

引言:时间模拟,是蓝桥杯最常见的题型,我愿意把他称作小白和入门画的界限,接下来就让我来带大家入门把!

<>一、模板
# 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; }
以上就是本次全部内容,如有不懂请留言!后续如果各位喜欢本类型的题,我也会出双指针与日期结合的题

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信