敲重点

·  显然,回文日期数包含ABABBABA型数

·  在循环里,用两个lookab/hw变量来表示是否找到了最近的ABABBABA型或者回文型日期,以防在还没找到ABABBABA型的时候,用于存放回文型日期的huiwen变量已经被赋值n次了。

·  由题意,写出算法在循环里,我们可以直接对年(输入的日期前四位数)进行年++。然后月和日直接根据年份来获得,再判断这个月和日在改年是否是合法的。如果你是想在循环里用日++,那就是大错特错了!太麻烦啦!

·  定义一个ishefa()方法来判断循环判断里的日期是否是合法的,注意闰年!

·  首先,输入的日期可能是回文日期,也可能是非回文日期。如果是回文日期,根据题意,就要过滤掉这个日期,找下一个满足的该类型。同理ABABBABA型也是如此。

·  如果当前输入的日期比该日期换算出来的回文日期或者ABABBABA日期小的话,那么结果就是换算出来的,若大,那就往后找。比如输入20200201,那么结果应该是20200202和21211212。如果输入20200330,结果是20211202和21211212


参考代码:

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
        Scanner sc = new Scanner(System.in);
        String str=sc.next(),huiwen="",ab="";
        int lookab=0,lookhw=0; //有没有找到ababbaba型或者回文日期
        int year=Integer.valueOf(str.substring(0, 4));
        int pyear=Integer.valueOf(str.substring(0, 2)); //年份前两位数
        int lyear=Integer.valueOf(str.substring(2, 4));//年份后两位数
        int month=Integer.valueOf(str.substring(4, 6)); 
        int day=Integer.valueOf(str.substring(6, 8));
        while(lookab+lookhw!=2){
            if(pyear==lyear&&month==day&&lyear%10==day/10&&lyear/10==day%10&&lookab!=1){ //ABABBABA型
                if(ishefa(pyear,lyear,month,day)){
                    String ly,py,mon,da;  //一位数的数要补前导零,下面的同理
                    if(month<10){
                        mon="0"+month;
                    }else{
                        mon=Integer.toString(month);
                    }
                    if(day<10){
                        da="0"+day;
                    }else{
                        da=Integer.toString(day);
                    }
                    if(lyear<10){
                        ly="0"+lyear;
                    }else{
                        ly=Integer.toString(lyear);
                    }
                    ab=ab.concat(Integer.toString(pyear)).concat(ly).concat(mon).concat(da);
                    lookab=1;
                }
            }
            if(month%10==lyear/10&&month/10==lyear%10&&day%10==pyear/10&&day/10==pyear%10&&lookhw!=1){  //回文日期
                if(ishefa(pyear,lyear,month,day)){
                    String ly,py,mon,da;
                    if(month<10){
                        mon="0"+month;
                    }else{
                        mon=Integer.toString(month);
                    }
                    if(day<10){
                        da="0"+day;
                    }else{
                        da=Integer.toString(day);
                    }
                    if(lyear<10){
                        ly="0"+lyear;
                    }else{
                        ly=Integer.toString(lyear);
                    }
                    huiwen=huiwen.concat(Integer.toString(pyear)).concat(ly).concat(mon).concat(da);
                    lookhw=1;
                }
            }
            if(month<lyear/10+(lyear%10)*10||(month==lyear/10+(lyear%10)*10&&day<pyear/10+(pyear%10)*10)){//考虑输入某年的回文值得月份和day是否比当前输入的年月日要大。再改变月、日。
                month=lyear/10+(lyear%10)*10;
                day=pyear/10+(pyear%10)*10;
            }else{
                year++;
                pyear=year/100;
                lyear=year%100;
                month=lyear/10+(lyear%10)*10;
                day=pyear/10+(pyear%10)*10;
            }
            if(huiwen.equals(str)) {lookhw=0;huiwen="";} //过滤掉输入的年月日刚好是回文型和ABABBABA型
            if(ab.equals(str)) {lookab=0;ab="";}
        }        
        System.out.println(huiwen);
        System.out.println(ab);    
    }
    public static boolean ishefa(int pyear,int lyear,int month,int day ){
        int year=pyear*100+lyear;
        int dayoftwo=0;
        if((year%4==0&&year%100!=0)||year%400==0){
            dayoftwo=29;
        }else{
            dayoftwo=28;
        }
        if(month>=1&&month<=12){
            if(month==2){
                if(day<=dayoftwo){
                    return true;
                }else{
                    return false;
                }
            }
            if(month==4||month==6||month==9||month==11){
                if(day<=30){
                    return true;
                }else{
                    return false;
                }
            }else{
                if(day<=31){
                    return true;
                }else{
                    return false;
                }
            }
        }else{
            return false;
        }        
    }
}


 

0.0分

83 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区