1 条题解

  • 0
    @ 2025-3-29 16:57:19

    枚举范围内的日期,判断是否合法且回文

    #include <bits/stdc++.h>
    using namespace std;
    // 2. 真实存在的日期
    // 传入年份与月份 返回这个月的天数
    int getDay(int y, int m)
    {
        if (m == 4 || m == 6 || m == 9 || m == 11)
            return 30;
        if (m != 2)
            return 31;
        if ((y % 4 == 0 && y % 100 != 0) ||
            (y % 400 == 0))
            return 29;
        return 28;
    }
    bool check2(int x)
    {
        // x: 20250329
        int y = x / 10000;
        int m = x / 100 % 100;
        int d = x % 100;
        if (m < 1 || m > 12)
            return false;
        if (d < 1 || d > getDay(y, m))
            return false;
        return true;
    }
    // 3. 回文
    bool check3(int x)
    {
        // abcdefgh
        int a = x / 10000000 % 10;
        int b = x / 1000000 % 10;
        int c = x / 100000 % 10;
        int d = x / 10000 % 10;
        int e = x / 1000 % 10;
        int f = x / 100 % 10;
        int g = x / 10 % 10;
        int h = x / 1 % 10;
        return a == h && b == g && c == f && d == e;
    }
    int main()
    {
        int date1, date2;
        cin >> date1 >> date2;
        int cnt = 0;
        // 1. date1 ~ date2
        // 2. 真实存在的日期
        // 3. 回文
        for (int i = date1; i <= date2; i++)
        {
            if (check2(i) && check3(i))
            {
                cnt++;
                //cout << i << "\n";
            }
        }
        cout << cnt;
        return 0;
    }
    

    枚举所有存在的日期,判断是否在范围内且回文

    #include <bits/stdc++.h>
    using namespace std;
    int date1, date2;
    // 1. date1 ~ date2
    bool check1(int x)
    {
        return date1 <= x && x <= date2;
    }
    // 2. 真实存在的日期
    // 传入年份与月份 返回这个月的天数
    int getDay(int y, int m)
    {
        if (m == 4 || m == 6 || m == 9 || m == 11)
            return 30;
        if (m != 2)
            return 31;
        if ((y % 4 == 0 && y % 100 != 0) ||
            (y % 400 == 0))
            return 29;
        return 28;
    }
    bool check2(int x)
    {
        // x: 20250329
        int y = x / 10000;
        int m = x / 100 % 100;
        int d = x % 100;
        if (m < 1 || m > 12)
            return false;
        if (d < 1 || d > getDay(y, m))
            return false;
        return true;
    }
    // 3. 回文
    bool check3(int x)
    {
        // abcdefgh
        int a = x / 10000000 % 10;
        int b = x / 1000000 % 10;
        int c = x / 100000 % 10;
        int d = x / 10000 % 10;
        int e = x / 1000 % 10;
        int f = x / 100 % 10;
        int g = x / 10 % 10;
        int h = x / 1 % 10;
        return a == h && b == g && c == f && d == e;
    }
    int main()
    {
        cin >> date1 >> date2;
        int cnt = 0;
        // 1. date1 ~ date2
        // 2. 真实存在的日期
        // 3. 回文
        for (int y = 1000; y <= 9999; y++)
            for (int m = 1; m <= 12; m++)
                for (int d = 1; d <= getDay(y, m); d++)
                {
                    // y 年 m 月 d 日
                    int i = y * 10000 + m * 100 + d;
                    if (check1(i) && check3(i))
                        cnt++;
                }
        cout << cnt;
        return 0;
    }
    

    枚举所有回文八位数,判断是否在范围内且真实存在

    #include <bits/stdc++.h>
    using namespace std;
    int date1, date2;
    // 1. date1 ~ date2
    bool check1(int x)
    {
        return date1 <= x && x <= date2;
    }
    // 2. 真实存在的日期
    // 传入年份与月份 返回这个月的天数
    int getDay(int y, int m)
    {
        if (m == 4 || m == 6 || m == 9 || m == 11)
            return 30;
        if (m != 2)
            return 31;
        if ((y % 4 == 0 && y % 100 != 0) ||
            (y % 400 == 0))
            return 29;
        return 28;
    }
    bool check2(int x)
    {
        // x: 20250329
        int y = x / 10000;
        int m = x / 100 % 100;
        int d = x % 100;
        if (m < 1 || m > 12)
            return false;
        if (d < 1 || d > getDay(y, m))
            return false;
        return true;
    }
    // 3. 回文
    bool check3(int x)
    {
        // abcdefgh
        int a = x / 10000000 % 10;
        int b = x / 1000000 % 10;
        int c = x / 100000 % 10;
        int d = x / 10000 % 10;
        int e = x / 1000 % 10;
        int f = x / 100 % 10;
        int g = x / 10 % 10;
        int h = x / 1 % 10;
        return a == h && b == g && c == f && d == e;
    }
    int main()
    {
        cin >> date1 >> date2;
        int cnt = 0;
        // 1. date1 ~ date2
        // 2. 真实存在的日期
        // 3. 回文
        for (int y = 1000; y <= 9999; y++)
        {
            // y: abcd
            //    abcddcba
            int a = y / 1000 % 10;
            int b = y / 100 % 10;
            int c = y / 10 % 10;
            int d = y / 1 % 10;
            int i = y * 10000 + d * 1000 + c * 100 + b * 10 + a * 1;
            if (check1(i) && check2(i))
                cnt++;
        }
        cout << cnt;
        return 0;
    }
    

    另一种枚举回文数的方法:

        // 3. 回文
        for (int a = 1; a <= 9; a++)
            for (int b = 0; b <= 9; b++)
                for (int c = 0; c <= 9; c++)
                    for (int d = 0; d <= 9; d++)
                    {
                        int i = a * 10000000 +
                                b * 1000000 +
                                c * 100000 +
                                d * 10000 +
                                d * 1000 +
                                c * 100 +
                                b * 10 +
                                a * 1;
                        if (check1(i) && check2(i))
                            cnt++;
                    }
    

    信息

    ID
    101
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    99
    已通过
    27
    上传者