2.26—— 问题 B: 回文日期

题目描述

    在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。    
    牛牛习惯用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表示,它不是回文的。    
    每一年中都有12个月份:    其中,1,  3,  5,   7,  8,      10,  12月每个月有31天;4,  6,  9,  11月每个月有30天;而对于2月,闰年时有29天,平年时有28天。       一个年份是闰年当且仅当它满足下列两种情况其中的一种:    1.这个年份是4的整数倍,但不是100的整数倍;    2.这个年份是400的整数倍。    
   例如:   
     ·以下几个年份都是闰年:2000 ,   2012 ,  2016。   
    ·以下几个年份是平年:1900,  2011、2014。
 

输入

     输入包括两行,每行包括一个8位数字。    
    第一行表示牛牛指定的起始日期dates,第二行表示牛牛指定的终止日期date2。保证dates和date:都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0;保证date一定不晚于date2。

输出

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

样例输入

复制样例数据

20110101
20111231

样例输出

1

提示

对于样例1,符合条件的日期是20111102。

感觉这种模拟题我一直很弱。这个需要思路清晰,并且代码易看才是对的。不然容易错。

#include <iostream>
#include <cstdio>
using namespace std;
int hh[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//每个月的天数,二月单独判断
//判断是否是闰年;
bool is_runnian(int n){
    if((n%4==0&&n%100!=0)||n%400==0) return true;
    return false;
}
//这个函数用来找此年此月多少天
int fun(int year,int month){
    if(month==2){
        if(is_runnian(year)){
            return 29;
        }
        else return 28;
    }
    else
        return hh[month];
}
int main()
{
    int n,m,i;
    int ans=0;
    cin>>n>>m;
    int a=n/10000,b=m/10000;
    int date;
    for(i=a;i<=b;i++){
//date表示此年的回文数
        date=i*10000+i%10*1000+i%100/10*100+i%1000/100*10+i/1000;
 //如果满足这个数位于输入两个数之间,月份位于1-12,月份对应的天数没有超过范围   if(date>=n&&date<=m&&date%10000/100>0&&date%10000/100<=12&&date%100<=fun(i,date%10000/100)){
            ans++;//答案++;
        }
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/skyleafcoder/p/12319537.html