有许多题目都是和日期相关,这里介绍一种通用的模板,主要进行日期的枚举,之后根据题目的具体要求进行添加限制条件即可。
模板代码
主要通过三层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;
}