2021寒假每日一題《回文日期》


回文日期

題目來源:第十一屆藍橋杯省賽第二場C++A/B組
時間限制:\(1000ms\) 內存限制:\(256mb\)

題目描述

2020 年春節期間,有一個特殊的日期引起了大家的注意:\(2020 年 2 月 2 日\)
因為如果將這個日期按 yyyymmdd 的格式寫成一個 8 位數是 20200202,恰好是一個回文數。
我們稱這樣的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。
對此小明很不認同,因為不到 2 年之后就是下一個回文日期:20211202\(2021 年 12 月 2 日\)
也有人表示 20200202 並不僅僅是一個回文日期,還是一個 ABABBABA 型的回文日期。
對此小明也不認同,因為大約 100 年后就能遇到下一個 ABABBABA 型的回文日期:21211212\(2121 年 12 月 12 日\)
算不上“千年一遇”,頂多算“千年兩遇”。
給定一個 8 位數的日期,請你計算該日期之后下一個回文日期和下一個 ABABBABA 型的回文日期各是哪一天。

輸入格式

輸入包含一個八位整數 \(N\),表示日期。

輸出格式

輸出兩行,每行 \(1\) 個八位數。
第一行表示下一個回文日期,第二行表示下一個 ABABBABA 型的回文日期。

數據范圍

對於所有評測用例,\(10000101≤N≤89991231\) ,保證 N 是一個合法日期的 8 位數表示。

樣例輸入

20200202

樣例輸出

20211202
21211212

解題思路

需要給出輸入日期的 下一個回文日期下一個 ABABBABA 型的日期
所以從輸入的數開始,每次循環+1。
date 表示輸入的數。
輸出的第一個數,需要判斷 date 是否為合法日期和回文數。
輸出的第二個數,除了需要上面的判斷外,還需要判斷是否為 ABABBABA 型的數。

一、判斷是否為合法日期

判斷一個數是否為合法日期,只需要看月份和天數是否能夠合法,比如:
1、3、5、7、8、10、12月,有31天;
4、6、9、11月,有30天;
2月 需要單獨進行判斷,如果年份為 閏年 ,2月有29天,否則2月只有28天。

二、判斷是否為回文數

將數字轉化為字符串,定義兩個指針,分別在左端和右端。
判斷左右兩端的字符是否一樣,如果一樣則左右指針都向內移動一位,依次進行判斷。
只要有一位不相同,就可以直接返回 false
兩個指針相遇的時候,代表字符串內的全部字符已經比較完畢,沒有需要不相同的,返回 true

三、判斷 ABABBABA 型數

只需判斷字符串的第 \(0,2,5,7\) 位是否相同,和字符串的第 \(1,3,4,6\) 位是否相同,且第 \(0,1\) 位不相同。

結束程序在輸出兩個數之后,可以使用兩個 boolean 型的變量存放輸出的狀態,兩個數都輸出之后結束循環。

解題代碼-Java

import java.util.Scanner;

public class Main {
    static boolean check(int n) {
        String s = Integer.toString(n);
        int l = 0, r = s.length() - 1;
        while (l < r) {
            if (s.charAt(l) != s.charAt(r)) {
                return false;
            }
            l++;
            r--;
        }
        return true;
    }

    static boolean checkDate(int n) {
        String s = Integer.toString(n);
        int year = Integer.parseInt(s.substring(0, 4));
        int month = Integer.parseInt(s.substring(4, 6));
        int day = Integer.parseInt(s.substring(6, 8));
        if (month <= 0 || month > 12) {
            return false;
        }
        if (day <= 0) {
            return false;
        }
        switch (month) {
            case 2:
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                    if (day > 29) {
                        return false;
                    }
                } else {
                    if (day > 28) {
                        return false;
                    }
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if (day > 30) {
                    return false;
                }
                break;
            default:
                if (day > 31) {
                    return false;
                }
                break;
        }
        return true;
    }

    static boolean checkABABBABA(int n) {
        char[] s = Integer.toString(n).toCharArray();
        return s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && s[1] == s[3] && s[1] == s[4] && s[1] == s[6] && s[0] != s[1];
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int date = input.nextInt() + 1;
        input.close();
        boolean flag1 = false, flag2 = false;
        while (!flag1 || !flag2) {
            if (!check(date)) {
                date++;
            } else if (!checkDate(date)) {
                date++;
            } else if (!flag1) {
                System.out.println(date);
                flag1 = true;
            } else if (!checkABABBABA(date)) {
                date++;
            } else if (!flag2) {
                System.out.println(date);
                flag2 = true;
            }
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM