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

基础函数模板

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;
}
相关推荐
念越7 分钟前
蓝桥杯自动化测试模拟1期答案及代码解析(完整版)
自动化测试·软件测试·selenium·蓝桥杯
蒸汽求职1 小时前
低延迟系统优化:针对金融 IT 与高频交易,如何从 CPU 缓存行(Cache Line)对齐展现硬核工程底蕴?
sql·算法·缓存·面试·职场和发展·金融·架构
南山乐只1 小时前
Java并发工具:synchronized演进,从JDK 1.6 锁升级到 JDK 24 重构
java·开发语言·后端·职场和发展
你撅嘴真丑10 小时前
[蓝桥杯 2025 省 B] 生产车间 与 装修报价
职场和发展·蓝桥杯
XWalnut10 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职10 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
Tanecious.11 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
Tanecious.11 小时前
蓝桥杯备赛:Day3-P1102 A-B 数对
c++·蓝桥杯
Tanecious.12 小时前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
Kk.080213 小时前
力扣 LCR 084.全排列||
算法·leetcode·职场和发展