zoukankan      html  css  js  c++  java
  • 2016NOIP普及组T2回文日期

    回文日期

    分类:枚举,函数

    【题目描述】

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

    牛牛习惯用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位数字。

    第一行表示牛牛指定的起始日期date1

    第二行表示牛牛指定的终止日期date2

    保证date1和date2都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0。

    保证date1一定不晚于date2。

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

    【输入样例】

    20110101 20111231

    【输出样例】 1

    【样例输入2】

    20000101

    20101231

    【样例输出2】

    2

    【提示】

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

    对于样例2,符合条件的日期是20011002和20100102

    对于60%的数据,满足date1=date2。

    整理:
    输入两个真实存在的八位数表示起始日期和结束日期(表示方法:前4位表示年,如2012,第5到6位表示月,月份<10时在前面补0, 如02 最后两位表示日期,如07,连起来就是20120207,2012年2月7号)
    在这两个日期之间,找出有多少个回文日期,回文日期指正着读反着读都一样的日期(如20100102,12011021)要注意日期必须是真实存在的,且要考虑闰年

    这道题我是从1年前刚接触时才开始做,到现在才明白,这道题有好几种方法,我给大家推荐一种最普遍,不废脑子还不会超时的方法,枚举年份

    枚举年份
    思路

    输入两个数字,用%和/取出它的年份,月份和日期
    先判断第一年的,用%和/取出它的年份,月份和日期,如果合法(月份>0&&<13,日期>0&&<该月天数+1)
    判断第二年到倒数第二年的所有日期,每次都用%和/取出它的年份,月份和日期,如果合法,则sum++
    最后一年判断,用%和/取出它的年份,月份和日期
    代码:

    #include <iostream>
    #include <string>
    using namespace std;
    int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    bool run(int y){
        
        if(y%4==0&&y%100!=0||y%400==0){
            return true;
        }
        return false;
    }
    bool hefa(int y,int a,int b){
        if(run(y)==true){
            day[2]=29;
        }else{
            day[2]=28;
        }
        if(a>=1&&a<=12&&b>=1&&b<=day[a]){
            return true;
        }
        return false;
    }
    
    int main(){
        int d1,d2,a,b,sum=0;
        cin>>d1>>d2;
        int year1=d1/10000,year2=d2/10000;
        int month1=year1%10*10+year1/10%10,month2=year2%10*10+year2/10%10,day1=year1/100%10*10+year1/1000*1,day2=year2/100%10*10+year2/1000*1;
        if(hefa(year1,month1,day1)&&month1>=(d1-year1*10000)/100&&day1>=(d1-year1*10000-month1*100)){
            sum++;
        }
        for(int i=year1+1;i<year2;i++){
            a=i%10*10+i/10%10;
            b=i/100%10*10+i/1000*1;
            if(hefa(i,a,b)){
                sum++;
            }
        }
        if(year1!=year2){
            if(hefa(year2,month2,day2)){
                sum++;
            }
        }
        
        cout<<sum;
        return 0;
    }
  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/AK-IOI/p/12726122.html
Copyright © 2011-2022 走看看