日期问题--备战蓝桥杯版

基础函数模板

1.闰年判断

闰年二月有29天,否则有28天

cpp 复制代码
bool isleap(int x)
{
	return(x%4==0&&x%100!=0)||(x%400==0);
}

2.每个月的天数

一三五七八十腊为31天

cpp 复制代码
int m[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getmdays(int year,int month)
{
	if(m==2&&isleap(year))
	{
		return 29;
	}
	return m[month];
}

3.日期合法性检查

cpp 复制代码
bool isvalid(int year,int month,int day)
{
	if(month<1||month>12)return false;
	if(day<1||day>getmdays(year,month))return false;
	return true;
}

日期处理两个方式

1.逐日模拟(适用于小范围)

cpp 复制代码
void addoneday(int year,int month,int day)
{
	day++;
	if(day>getmdays(year,month))
	{
		day=1;
		month++;
		if(month>12)
		{
			year++;
			month=1;
		}
	}
}

2.转换为绝对天数(大范围)

cpp 复制代码
int daytodays(int year,int month,int day)
{
	int days=0;
	for(int y=1;y<year;y++)
	{
		days+=isleap(y)?366:365;
	}
	
	for(int m=1;m<month;m++)
	{
		days+=getmdays(year,m);
	}
	days+=day;
	return days;
}

练习1:

P2010 NOIP 2016 普及组 回文日期 - 洛谷

练习2:求两个日期的差

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool isleapyear(int y)
{
	return (y%100!=0&&y%4==0)||(y%400==0);
} 

bool isvalid(int y,int m,int d)
{
	if(m<1||m>12)return false;
	if(m==2&&isleapyear(y))
	{
		return d>=1&&d<=29;
	}
	return d>=1&&d<=monthdays[m]; 
}

int daysfromstart(int year,int month,int day)
{
	if(!isvalid(year,month,day))return -1;
	int days=0;
	for(int y=1;y<year;y++)
	{
		days+=isleapyear(y)?366:365;
	}
	
	for(int m=1;m<month;m++)
	{
		if(m==2&&isleapyear(year))
		{
			days+=29;
		}
		else days+=monthdays[m];
	}
	days+=day;
	return days;
}

int main()
{
	int y1,m1,d1;
	int y2,m2,d2;
	
	cin>>y1>>m1>>d1;
	cin>>y2>>m2>>d2; 
	
	int a=daysfromstart(y1,m1,d1);
	int b=daysfromstart(y2,m2,d2);
	
	cout<<(b-a)<<endl;
	return 0;
}

练习3(逐日模拟)

1.艺术与篮球 - 蓝桥云课

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int bihua[10]={13,1,2,3,5,4,4,2,2,2};

bool isleap(int y)
{
  return (y%4==0&&y%100!=0||y%400==0);
}

int totalsum(int year,int month,int day)
{
	int num=year*10000+month*100+day;
	int sum=0;
	for(int i=0;i<8;i++)
	{
		int data=num%10;
		sum+=bihua[data];
		num/=10;
	}
	return sum;
} 


int main()
{
	int y1=2000,m1=1,d1=1;
	int y2=2024,m2=4,d2=13;
	int res=0;
	for(int y=y1;y<=y2;y++)
	{
		for(int m=1;m<=12;m++)
		{
			if(y==y2&&m>m2)break;
			int maxday=monthdays[m];
			if (m == 2 && isleap(y)) maxday = 29;
			for(int d=1;d<=maxday;d++)
			{
				if(y==y2&&m==m2&&d>d2)break;
				int strokes=totalsum(y,m,d);
				if(strokes>50)
				{
					res++;
				}
			}
		}
	}
	cout<<res<<endl;
	return 0;
}
相关推荐
天真小巫5 小时前
2026.9.19总结
职场和发展
顶点多余5 小时前
9.20 知识点查漏补缺
linux·面试·职场和发展
捷瑞电子工坊7 小时前
嵌入式蓝桥杯从零点亮第一个LED
stm32·蓝桥杯·cubemx·嵌入式·led·ll·锁存
yuanxi2009 小时前
上药集团药品销售公司签署沪明医疗数链协议:PSS⁵视角下的跨区域数据合作机会
职场和发展·创业创新·学习方法
顶点多余1 天前
9.16 面试总结
linux·面试·职场和发展
yuanxi2002 天前
圣湘生物的三重转变:用PSS⁵价值力看懂从卖单品到卖经营价值
职场和发展·创业创新·学习方法
weixin_435208162 天前
【大模型面试宝典】开源啦!!!
人工智能·职场和发展·agent·deepseek
jianqiang.xue2 天前
如何做好IT类的技术面试?
面试·职场和发展
y1su2 天前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展
hqyjzsb3 天前
规划工商管理大学成长:搭建四层能力体系,重视高阶的 AI 能力建设
开发语言·人工智能·python·microsoft·职场和发展·数据挖掘·业界资讯