PPPPP_in 2023-01-24 23:14 采纳率: 100%
浏览 35
已结题

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

回文日期 代码哪儿出问题?
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;
}
  • 写回答

4条回答 默认 最新

  • Vec_Kun 全栈领域新星创作者 2023-01-25 10:43
    关注

    (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;
    }
    

    望采纳!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 修改了问题 1月25日
  • 创建了问题 1月24日

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程