蓝桥杯-时间模拟

本文详细介绍了如何通过C/C++实现时间模拟,包括闰年判断、月份天数计算,以及如何处理特殊日期格式。通过实例演示了如何计算特定日期在给定年份中的位置,并深入讲解了如何使用sprintf函数处理顺子日期问题。
摘要由CSDN通过智能技术生成

蓝桥杯-时间模拟

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

一、模板

# 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++;
        }
    }
}

这里的结果,可自行打印

套路整理:

  1. 开辟一个数组存12个月份的天数

这里我的记忆方式是,1、3、5、7、 、8、10、12 前奇数后偶数,二月是28天

  1. 接下来是就是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;
}

以上就是本次全部内容,如有不懂请留言!后续如果各位喜欢本类型的题,我也会出双指针与日期结合的题

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值