java-回文日期 [蓝桥]

最近刷题刷到回文日期,通过率死活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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值