关于#测试用例#的问题,如何解决?

回文日期 代码哪儿出问题?
10个测试用例通过9个,用例2也不知道是啥,求指点!

// 普通回文: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;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^