敲重点
· 显然,回文日期数包含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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复