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

基础函数模板

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 小时前
大厂OS面试高频题
面试·职场和发展
炜宏资料库11 小时前
国网最新:电力市场结算规则解读
职场和发展
洛水水11 小时前
【力扣100题】46.单词拆分
算法·leetcode·职场和发展
洛水水14 小时前
【力扣100题】45.零钱兑换
算法·leetcode·职场和发展
芝士爱知识a14 小时前
2026 年教资面试考前急救软件推荐:基于智蛙面试app的技术评测
面试·职场和发展·智蛙面试·教资面试软件·ai模拟面试·教资考前急救·多模态大模型应用
帅次15 小时前
Android 高级工程师面试参考答案:项目经历、自我介绍与实战案例表达
android·面试·职场和发展
洛水水15 小时前
【力扣100题】47.最长递增子序列
算法·leetcode·职场和发展
木子墨51616 小时前
系统设计面试 | 实现一个限流器:滑动窗口 → 令牌桶 → 漏桶
java·开发语言·数据结构·数据库·面试·职场和发展
_日拱一卒17 小时前
LeetCode:199二叉树的右视图
算法·leetcode·职场和发展
鱼子星_17 小时前
【数据结构与算法】OJ题目详解(一)-单链表:从易到难的面试OJ题目
c语言·数据结构·算法·链表·面试·职场和发展