题目描述
题目内容不在赘述,这里介绍一下最暴力brainless的做法
1.直接枚举date1-date2(包含date1date2)的每个数
2.逐一判断日期是否合法?是否为回文?(这两个函数会在代码中展示)
样例
输入样例:
20110101
20111231
输出样例:
1
算法1
(暴力枚举) $O(n)$
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<queue>
using namespace std;
int months[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool leap_year(int year)//判断闰年
{
if((year%400==0)||(year%100!=0&&year%4==0))
{
return true;
}
else
{
return false;
}
}
bool valid_day(int year,int month,int day)//判断日期是否合法
{
if(month==0||month>12)//如果当前从8个数中分离的月份不在1-12月
{
return false;
}
if(day==0) return false;//如果日是0
if(month==2)//分类讨论是否为2月,如果为2月,闰年29天,平年28天。如果当前从8个数中分离的天数大于当前天数
{
int x=months[2];
if(leap_year(year))
{
x++;
}
if(day>x)
{
return false;
}
}
else
{
if(day>months[month])
{
return false;
}
}
return true;
}
bool check(int date)//11111111,因为题目规定了给定的date1有且仅有8个数,所以只需要看看对称位置是否相等
{
int x1=date/10000000;
int x2=date/1000000%10;
int x3=date/100000%10;
int x4=date/10000%10;
int x5=date/1000%10;
int x6=date/100%10;
int x7=date/10%10;
int x8=date%10;
if(x1==x8&&x2==x7&&x3==x6&&x4==x5)
{
return true;
}
else
{
return false;
}
}
int main()
{
int date1,date2;
int ans=0;
cin>>date1>>date2;
for(int i=date1;i<=date2;i++)
{
int year=i/10000,month=i%10000/100,day=i%100;
if(valid_day(year,month,day))
{
if(check(i))
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;//dont forget
}