最近刷题刷到回文日期,通过率死活90%,又不知道是什么错了,参考了万年之内到底有几个回文日期-阿里云开发者社区 (aliyun.com),去一个一个对看少了什么.
原题目连接:回文日期 - 蓝桥云课 (lanqiao.cn)
java解题代码如下:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class No1 {
public static void main(String[] args) {
//回文日期 2020 0202 2021 1202 2121 1212 字符'0'=48
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
long date;
int year,month,day,flag=0;
//输入判断
while (true) {
date=scan.nextLong();
year=(int) (date/10000);
month=(int) (date%10000/100);
day=(int) (date%100);
// System.out.println(year+"年"+month+"月"+day);
if (date>=10000101 && date<=89991231) {
long date2=rightdate(year, month, day);
if (date==date2) {
break;
}
}
}
//寻找下一个回文日期,下一个ABABBABA
// ABC CBA
// year/10 sum,temp
// ABA ABA
while (true) {
day++;
date=rightdate(year, month, day);
year=(int) (date/10000);
month=(int) (date%10000/100);
day=(int) (date%100);
// System.out.println(year+"年"+month+"月"+day);
int temp=year;
int sum=0;
for (int i = 0; i < 4; i++) {
sum=sum*10+temp%10; //0202无法实现!!!=202 >? 2021 1202 2020 0202
temp=temp/10;
}
int temp2=month*100+day;
//0202等0开头月份情况
if(year%10==0){
//在ABC0 0CBA
if (sum==temp2) {
//返回第一个回文日期
if (flag==0) {
System.out.println(date);
flag++;
// System.out.println("!"+date);
}
//返回A0A0 0A0A型回文日期
if (month==day) {
System.out.println(date);
break;
}
}
} else{
//ABCD DCBA
if (sum==temp2) {
//返回第一个回文日期
System.out.println(date);
flag++;
if (flag==0) {
}
// 返回ABAB BABA型回文日期
if (month==day && year/1000!=year%10) {
System.out.println(date);
break;
}
}
// if (date>99999999) {
// System.out.println(flag);
// break;
// }
}
}
scan.close();
}
//判断是否是一个合法日期,如果不是返回一个正确的日期(只能是多一天)
//大月:1,3,5,7,8,10,12
//小月:4,6,9,11 特殊:2(需要判断是不是润年)
public static long rightdate(int year,int month,int day) {
long date;
if(month>=1 && month<=12){
if(month==2){
if (year%4==0) {
//润年
if (day>29) {
day=day-29;
month++;
}
}else{
//平年
if (day>28) {
day=day-28;
month++;
}
}
}else if(month==4 || month==6 || month==9 || month==11){
//小月
if (day>30) {
day=day-30;
month++;
}
}else{
//大月
if (day>31) {
day=day-31;
month++;
}
}
}
//这里不用else if 是因为12.31号->13.2过年会跳过哦
if(month>12){
month=month-12;
year++;
}
date=year*10000+month*100+day;
return date;
}
}