[AcWing] 迴文日期

迴文日期

題目

在日常生活中,通過年、月、日這三個要素可以表示出一個唯一確定的日期。

牛牛習慣用 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

題解

思路

  • 首先構造迴文數
  • 判斷其是否在給定日期期間
  • 判斷其是否符合日期的格式與範圍
#include <iostream>

using namespace std;

int n, m, md[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int x) {
    int year = x / 10000, month = x % 10000 / 100, day = x % 100;
    if (month < 1 || month > 12) return false;
    if (day < 1 || month != 2 && day > md[month]) return false;
    if (month == 2) {
        int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
        if (day > md[month] + leap) return false;
    }
    return true;
}

int main () {
    cin >> n >> m;
    
    int res = 0;
    for (int i = 1000; i <= 9999; i ++) {
        int num = i, x = i;
        for (int j = 0; j < 4; j ++) num = num * 10 + x % 10, x /= 10;
        if (num >= n && num <= m && check(num)) res ++;
    }
    cout << res;
    
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章