题目链接
题目描述
解题思路
首先就是日期判断,注意这个地方是日期,而不是这之间的所有数据
例如44444444
这种虽说是回文串,但是并不是日期,所以需要排除
判断回文串其实不用打表,因为真正要便利的数据其实不多,主要就是ABABBABA回文串耗费的时间多
所以单独先跑一个程序,把所有的ABABBABA全都跑出来
int a[11]={10100101,11111111,20200202,21211212,30300303,40400404,50500505,60600606,70700707,80800808,90900909};
一共就有这几个数据,然后当每次找到第一个回文串后,直接遍历a数组就可以在规定时间内快速找到
题解
打表程序
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
vector<int> v1;
vector<int> v2;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int yy,int mm,int dd){
if(mm>=1&&mm<=12){
if((yy%4==0&&yy%100!=0)||(yy%400==0)){
month[2]=29;
}else{
month[2]=28;
}
if(dd>=1&&dd<month[mm]){
return true;
}
}
return false;
}
int main(){
int n=10000101;
for(int i=10000101;i<=99999999;i++){
int yy=i/10000;
int mm=i%10000/100;
int dd=i%100;
//cout<<yy<<" "<<mm<<" "<<dd<<endl;
if(judge(yy,mm,dd)){
stringstream ss;
ss<<i;
string s;
ss>>s;
ss.clear();
string t=s;
reverse(t.begin(),t.end());
if(s==t){
v1.push_back(i);
if(s[0]==s[2]&&s[0]==s[5]&&s[0]==s[7]&&s[1]==s[3]&&s[1]==s[4]&&s[1]==s[6]){
v2.push_back(i);
}
}
}
}
for(int i=0;i<v1.size();i++){
cout<<v1[i]<<" ";
}
cout<<endl;
for(int i=0;i<v2.size();i++){
cout<<v2[i]<<" ";
}
}
最终程序
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
vector<int> v1;
vector<int> v2;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int a[11]={10100101,11111111,20200202,21211212,30300303,40400404,50500505,60600606,70700707,80800808,90900909};
bool judge(int yy,int mm,int dd){
if(mm>=1&&mm<=12){
if((yy%4==0&&yy%100!=0)||(yy%400==0)){
month[2]=29;
}else{
month[2]=28;
}
if(dd>=1&&dd<month[mm]){
return true;
}
}
return false;
}
int main(){
int n;
cin>>n;
for(int i=n;i<=99999999;i++){
int yy=i/10000;
int mm=i%10000/100;
int dd=i%100;
//cout<<yy<<" "<<mm<<" "<<dd<<endl;
if(judge(yy,mm,dd)){
stringstream ss;
ss<<i;
string s;
ss>>s;
ss.clear();
string t=s;
reverse(t.begin(),t.end());
if(s==t){
cout<<s<<endl;
break;
}
}
}
for(int i=0;i<11;i++){
if(n<a[i]){
cout<<a[i];
break;
}
}
}