敲重点
· 显然,回文日期数包含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 人评分
回文数字 (C++代码)浏览:890 |
钟神赛车 (C++代码)浏览:905 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:644 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)万恶的long long浏览:907 |
简单的for循环浏览:1498 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:648 |
printf基础练习2 (C语言代码)浏览:796 |
母牛的故事 (C语言代码)浏览:1451 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:583 |
1012题解浏览:938 |