zoukankan      html  css  js  c++  java
  • AcWing 466. 回文日期

    题目:
    在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

    牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。

    显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。

    牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。

    现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。

    一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8) 从左向右数的第i个数字和第 9−i 个数字(即从右向左数的第 i 个数字)是相同的。

    例如:

    •对于2016年11月19日,用 8 位数字 20161119 表示,它不是回文的。

    •对于2010年1月2日,用 8 位数字 20100102 表示,它是回文的。

    •对于2010年10月2日,用 8 位数字 20101002 表示,它不是回文的。

    输入格式:
    输入包括两行,每行包括一个8位数字。

    第一行表示牛牛指定的起始日期date1,第二行表示牛牛指定的终止日期date2。保证date1和date2都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0。

    保证date1一定不晚于date2。

    输出格式:
    输出共一行,包含一个整数,表示在date1和date2之间,有多少个日期是回文的。

    输入样例:

    20110101
    20111231
    

    输出样例:

    1
    

    分析:
    由于只有八位数,而且回文串左右对称,因此可以只枚举左半边,这样只需枚举 0∼9999 总共一万个数,然后判断:

    • 整个八位数构成的日期是否合法;
    • 是否在范围内

    注意:
    (1)由于日期具有单调递增性,则date1 <= date <= date2,表示当前日期在指定范围内
    (2)如何判断是闰年还是平年

    • 普通闰年:公历年份是4的倍数的,且不是100的倍数,为闰年。

    • 世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    bool check(int date)
    {
        int year = date / 10000;
        int month = date % 10000 / 100;
        int day = date % 100;
        
        if(!month || month > 13 || !day) return false;
        
        if(month != 2 && day > months[month]) return false;
        if(month == 2)
        {
            bool leap = year % 4 == 0 && year % 100 || year % 400 == 0;      // 判断闰年
            if(day > 28 + leap) return false;
        }
        
        return true;
    }
    int main()
    {
        int date1, date2;
        cin >> date1 >> date2;
        int res = 0;
        for(int i = 1000; i < 10000 ; i ++)
        {
            int x = i, date = i;
            // 年份翻转
            for(int j = 1 ; j <= 4 ; j ++)
            {
                date = date * 10 + x % 10;
                x /= 10;
            }
            if(date1 <= date && date2 >= date && check(date)) res ++;
        }
        
        cout << res << endl;
        
        return 0;
    }
    
  • 相关阅读:
    元组
    字典
    列表
    数据类型-字符串(str)
    python安装和首次使用
    javac++的stl解决重复的元素
    c++二分法求一个数的完全平方数
    双指针法----->求数组中两数之和
    java的二分法求一个数的平方根
    Java递归加上二分搜索将有序数组转化为平衡二叉树2
  • 原文地址:https://www.cnblogs.com/xiaofrank/p/14369530.html
Copyright © 2011-2022 走看看