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

基础函数模板

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;
}
相关推荐
EnCi Zheng25 分钟前
S10-蓝桥杯 17822 乐乐的积木塔
职场和发展·蓝桥杯
笨蛋不要掉眼泪2 小时前
面试篇-java基础上
java·后端·面试·职场和发展
A_aspectJ3 小时前
如何抓住Java开发岗的市场红利?从需求端反推学习路径
java·开发语言·职场和发展
嘻嘻哈哈樱桃4 小时前
牛客经典101题题解集--二叉树
java·数据结构·python·算法·leetcode·职场和发展
菜菜的顾清寒7 小时前
力扣100(20)旋转图像
算法·leetcode·职场和发展
The Chosen One9857 小时前
算法题目分享(二分算法)
算法·职场和发展·蓝桥杯
酉鬼女又兒7 小时前
JavaLeetCode 第一题「两数之和」:从暴力枚举到一遍哈希表的正确与错误实现,详解HashMap核心知识点及常见陷阱
java·开发语言·数据结构·算法·leetcode·职场和发展·散列表
其实防守也摸鱼7 小时前
面试常问问题总结--渗透测试工程师方向
网络·sql·面试·职场和发展·xss·工具·owasp
菜菜的顾清寒8 小时前
力扣hot100(21)搜索二维矩阵 II
算法·leetcode·职场和发展
笨蛋不要掉眼泪8 小时前
面试篇-java基础下
java·后端·面试·职场和发展