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

基础函数模板

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;
}
相关推荐
程序员Rock16 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
晚笙coding1 天前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
zzz_23682 天前
码上面试平台测试报告:功能、后台管理、异常状态与 JMeter 性能验证
jmeter·面试·职场和发展
浩哥学JavaAI2 天前
2026年最新AI agent面试(10)_通信与行业动态
人工智能·面试·职场和发展
hqyjzsb3 天前
非计算机专业学生怎么进入AI相关方向
人工智能·职场和发展·金融·数据挖掘·数据分析·aigc·业界资讯
tkevinjd3 天前
力扣72-编辑距离
算法·leetcode·职场和发展
天才测试猿3 天前
Selenium自动化测试网页加载太慢怎么解决?
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
wjm0410063 天前
ios学习路线 -- objective-c 基础
面试·职场和发展
ychqsq4 天前
88.归途
经验分享·职场和发展
CoderYanger4 天前
A.每日一题:3020. 子集中元素的最大数量
java·程序人生·算法·leetcode·面试·职场和发展·学习方法