// 普通回文:ABCDDCBA 特殊回文:ABABBABA
// 输入日期-判断日期是否正确-判断当年是否存在回文日期并且在输入日期之后-若不存在,年份+1,月=1,日=1,根据年份建立回文日期-判断该回文日期是否正确
#include <stdio.h>
int dat(int year,int month,int day);
int main(int argc, const char * argv[]) {
int date=0;
scanf("%d",&date); //输入日期
int year=0,month=0,day=0; //日期拆解为年、月、日
day=date%100;
date/=100;
month=date%100;
year=date/100;
if(dat(year,month,day)==0)return 0;
//判断输入日期当年是否存在回文日期,不存在则year+1
//1,2为ABBA和普通指示数 3为全部计算出回文的指示数
int flag_1=0,flag_2=0;
int s1[3]={0},s2[3]={0};//储存回文日期和ABBA式回文日期
while((flag_1==0||flag_2==0)&&year<9999)
{
int ye=year/100;
int ar=year%100;
int ra=ar%10*10+ar/10; //获得回文的month:ra 和day:ey
int ey=ye%10*10+ye/10;
//判断日期是否合法,11111111不算ABABBABA回文
int y=ye/10,e=ye%10;
if(dat(year,ra,ey)==0||y==e){
year++;
month=0;
day=0;
continue;
}
if((month==ra && day<ey)||month<ra)
{
if(flag_1==0 && ye==ar){ //ABBA式回文
s2[0]=year;
s2[1]=ra;
s2[2]=ey;
flag_1=1;
}
else if (flag_2==0){
s1[0]=year; //普通回文
s1[1]=ra;
s1[2]=ey;
flag_2=1;
}
//year满足回文要求并且日期满足回文要求
}
//不满足
year++;
month=0;
day=0;
}
printf("%d%02d%02d\n",s1[0],s1[1],s1[2]);
printf("%d%02d%02d\n",s2[0],s2[1],s2[2]);
return 0;
}
//判断输入的日期是否正确
int dat(int y,int m,int d){
if (m<1||m>12||d>31||d<1)return 0;
int f=0;
if((y%400==0||y%4==0)&&y%100!=0)//判断闰年
f=1;
if(m==2&&d>28+f)
return 0;
int e=0;
if(m<8)
e=m%2;
else e=(m+1)%2;
if(d>30+e)return 0;
return 1;
}
(1)在满足日期合理的情况下才能去判断是否是回文+是否是ABABBABA式,同时是否是ABABBABA式又是是否式回文的充分条件,因此先判断是否是回文再判断是否是ABABBABA式
(2)注意是寻找最近的日期,要设置标志变量来标记是否已经找到满足条件的日期
(3)写这种题时要列出来题目要求的条件,然后理清楚条件之间的关系以及实现这些条件的先后顺序,一定要理清楚思路。
(4)满足多个条件时要先理清楚思路
(5)反转字符串判断回文
(6)利用stringstream整型向字符串转化
#include<bits/stdc++.h>
using namespace std;
string int_str(int n)//将整型的数字转化成字符串
{
string str;
stringstream m;
m<<n;
m>>str;
return str;
}
bool isdate(int n)//判断日期是否合理
{
int month=(n%10000)/100;
int day=(n%10000)%100;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<=31) return true;
}
if(month==4||month==6||month==9||month==11)
{
if(day<=30) return true;
}
if(month==2)
{
if((n%4==0&&n%100!=0)||(n%400==0))
{
if(day<=29) return true;
}
else
{
if(day<=28) return true;
}
}
return false;
}
bool huiwen(string n)
{
string p1=n.substr(0,4);
string p2=n.substr(4,4);
reverse(p2.begin(),p2.end());
if(p1==p2) return true;
else return false;
}
bool ABABBABA(string n)
{
if(huiwen(n))//先判断是否是回文
{
if(n[0]==n[2]&&n[1]==n[3])//是否是ABABBABA
return true;
}
return false;
}
int main()
{
int n;
cin>>n;//输入年份
bool flag=0;//是否找到回文
for(int i=n+1 ; i<=100000000 ; i++)
{
if(isdate(i))
{
string str=int_str(i);
if(!flag&&huiwen(str))
{
cout<<str<<endl;
flag=1;//已经找到回文数了
}
if(flag&&ABABBABA(str))
{
cout<<str;
break;
}
}
}
return 0;
}
望采纳!!!
没问题。
想到了测试用例2,两种回文可以是一样的,题目并未说明两种回文不能一样。经测试,10个用例全部通过。
//
// 普通回文:ABCDDCBA 特殊回文:ABABBABA
//输入日期-判断日期是否正确-判断当年是否存在回文日期并且在输入日期之后-若不存在,年份+1,月=1,日=1,根据年份建立回文日期-判断该回文日期是否正确
#include <stdio.h>
int dat(int year,int month,int day);
int main(int argc, const char * argv[]) {
int date=0;
scanf("%d",&date); //输入日期
int year=0,month=0,day=0; //日期拆解为年、月、日
day=date%100;
date/=100;
month=date%100;
year=date/100;
if(dat(year,month,day)==0)return 0;
//判断输入日期当年是否存在回文日期,不存在则year+1
//1,2为ABBA和普通指示数 3为全部计算出回文的指示数
int flag_1=0,flag_2=0;
int s1[3]={0},s2[3]={0};//储存回文日期和ABBA式回文日期
while((flag_1==0||flag_2==0)&&year<9999)
{
int ye=year/100;
int ar=year%100;
int ra=ar%10*10+ar/10; //获得回文的month:ra 和day:ey
int ey=ye%10*10+ye/10;
//判断日期是否合法,11111111不算ABABBABA回文
int y=ye/10,e=ye%10;
if(dat(year,ra,ey)==0||(ye==ar&&y==e)){
year++;
month=0;
day=0;
continue;
}
if((month==ra && day<ey)||month<ra)
{//year满足回文要求并且日期满足回文要求
if(flag_1==0 && ye==ar){//ABBA式回文
s2[0]=year;
s2[1]=ra;
s2[2]=ey;
flag_1=1;
}
if (flag_2==0){
s1[0]=year; //普通回文
s1[1]=ra;
s1[2]=ey;
flag_2=1;
}
}//不满足
year++;
month=0;
day=0;
}
printf("%d%02d%02d\n",s1[0],s1[1],s1[2]);
printf("%d%02d%02d\n",s2[0],s2[1],s2[2]);
return 0;
}//判断输入的日期是否正确
int dat(int y,int m,int d){
if (m<1||m>12||d>31||d<1)return 0;
int f=0;
if((y%400==0||y%4==0)&&y%100!=0)//判断闰年
f=1;
if(m==2&&d>28+f)
return 0;
int e=0;
if(m<8)
e=m%2;
else e=(m+1)%2;
if(d>30+e)return 0;
return 1;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: