AcWing 466. 回文日期
原题链接
简单
作者:
Will_15
,
2023-02-06 12:01:42
,
所有人可见
,
阅读 205
//一定分析出所有的范围,数据给出了范围就直接用,没有就自己分析
//正着枚举复杂,想想反着枚举。正着思考复杂,想想反着思考。正着求,反着判断
//枚举所有日期得到是否回文复杂,想想枚举所有回文是否在日期范围内就简单了
//一定要写在纸上分析
//把一些东西刚开始存起来就可以少很多判断
//整体判断不了,我们可以一半一半判断呗
//main:输入数据,遍历所有回文数,用整形来翻转,判断是否在范围内,判断是否合法
//check_valid:取出年月日,判断月,判断日,判断二月,返回真
#include<iostream>
using namespace std;
const int N=10010;
int res;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//全局变量不可随意改变
bool check_valid(int x)
{
int year=x/10000;
int month=x%10000/100;
int day=x%100;
if(month==0||month>12)return false;//小方面判断就是==0
if(day==0||month!=2&&day>days[month])return false;
if(month==2)//情况特殊就最后来判断
{
int leap=(year%4==0&&year%100!=0||year%400==0);//这里用leap判断是否闰年,是闰年加上,不是就加零
if(day>days[2]+leap)return false;//days[]是全局变量,不能随意改变
}
return true;
}
int main()
{
int st,ed;
cin>>st>>ed;
for(int i=1000;i<10000;i++)//正着遍历不行,就反着想,日期怎么回文变成回文怎么日期
{
int date=i,x=i;
for(int i=0;i<4;i++)//通过一半得到回文
{
date=date*10+x%10;
x/=10;
}
if(date>=st&&date<=ed&&check_valid(date))res++;//用八位数字判断在日期内且合法
}
cout<<res<<endl;
return 0;
}