基础函数模板
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(逐日模拟)
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;
}