日期问题--代码模板详解--举例(顺子日期)

有许多题目都是和日期相关,这里介绍一种通用的模板,主要进行日期的枚举,之后根据题目的具体要求进行添加限制条件即可。

模板代码

主要通过三层for循环进行枚举,日期一年365天,数据不是很大,因此采用这种方式进行。
其中的年份可以根据具体题目要求进行更改

#include <iostream>
#include <bits/stdc++.h> 
using namespace std;

int main(int argc, char** argv) {
	//2022,2024根据题目要求进行变更
	for(int year=2022; year<=2024; year++)
	{
		for(int month=1; month<=12; month++)
		{
			for(int day=1; day<=31; day++)
			{
				if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12);
				else if(month == 2)
				{
					if((year%400==0) || (year%4==0 && year%100!=0))
					{
						if(day >29) break;
					}
					else
					{
						if(day > 28) break;
					}
				}
				else
				{
					if(day > 30) break;
				}
			}
		}
	}
	cout << res;
	return 0;
}

举例

下面我们就根据模板来练习练习8
解题思想在代码注释里面~~

顺子日期

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的yyyymmdd表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123:而 20221023则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?

#include <iostream>
#include <bits/stdc++.h> 
using namespace std;

int main(int argc, char** argv) {
	//定义一个字符数组,用来存储当前的日期
	char str[20];
	//用来保存结果
	int res = 0;
	//这里就依照题目要求:仅计算2022年内的顺子日期
	for(int year=2022; year<=2022; year++)
	{
		for(int month=1; month<=12; month++)
		{
			for(int day=1; day<=31; day++)
			{
				if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12);
				else if(month == 2)
				{
					if((year%400==0) || (year%4==0 && year%100!=0))
					{
						if(day >29) break;
					}
					else
					{
						if(day > 28) break;
					}
				}
				else
				{
					if(day > 30) break;
				}
				//限定条件
				//顺子日期:
				//sprintf可以直接把相应的正数拼接组合成我们规定的格式,然后写入str数组中,从str[1]开始写入
				sprintf(str+1, "%d%02d%02d", year,month,day);
				//开始判断:由于只计算2022年内的因此从第4个字符开始也就是从最后一个2开始,不能超出范围,顺子则表明从右向左依次大于1
				for(int i=4; i+2<=8; i++)
				{
					if(str[i+1]-str[i]==1 && str[i+2]-str[i+1]==1)
					{
						//puts可以打印出符合要求的日期
						// puts(str+1);
						//结果+1
						res++;
						//如果该日期满足要求则直接退出该循环,避免重复
						//比如20220123这是一个顺子日期,如果没有break的话res会加两次,分别是012和123
						break;
					}
				}
			}
		}
	}
	//最后将结果打印
	cout << res;
	return 0;
}

星系炸弹

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。 每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹 2015年1月1日放置,定时为15天,则它在2015年1月16 日爆炸。
有一个贝塔炸弹,2014年 11月9日放置,定时为 1000 天,请你计算它爆炸的准确日期。
请输出该日期,格式为yyyy-mm-dd即4位年份2位月份2位日期。比如:2015-02-19.

#include <iostream>
#include <bits/stdc++.h> 
using namespace std;

int main(int argc, char** argv) {
	//定义标志,当日期到达2014-11-09时开始计数
	int flag = 0;
	//记录天数,当到达1001天时输出日期(为什么1001下面解释)
	int bigbang = 0;
	for(int year=2014; year<=2020; year++)
	{
		for(int month=1; month<=12; month++)
		{
			for(int day=1; day<=31; day++)
			{
				if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12);
				else if(month == 2)
				{
					if((year%400==0) || (year%4==0 && year%100!=0))
					{
						if(day >29) break;
					}
					else
					{
						if(day > 28) break;
					}
				}
				else
				{
					if(day > 30) break;
				}
				
//				星系炸弹 
				//当到达炸弹放置日期时给标志位置1
				if(year == 2014 && month == 11 && day == 9)
				{
					flag = 1;
				}
				//当标志位置1时,开始记录天数
				if(flag == 1)
				{
					bigbang++;
				}
				//当天数等于1001时开始输出当前日期
				//通过题目举例可以得知,1月1日放置的炸弹,放15天,1月16日爆炸,1+15=16可以得出炸弹安置当天不算入定时日期内,因此11月9日时bigbang==1,从11月9日开始记录1000天,1+1000==1001,因此bigbang==1001时就是爆炸日期
				if(bigbang == 1001)
				{
					printf("%d-%02d-%02d", year, month, day);
					break;
				}
			}
		}
	}
	return 0;
}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值