NOIP2016回文日期

链接:https://ac.nowcoder.com/acm/problem/16438
来源:牛客网

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

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

这个题目主要培养了一下枚举思想。这个题的拿到题的第一想法是枚举从第一个输入到第二个输入之间所有的日期,判断是否回文并输出。但是这样恰恰掉入了出题人的陷阱,首先是枚举的范围太大,其次是在枚举时候还需要考虑年月日转换的问题,显然是小题大做。

再次审题可以发现,如果把前四位(年份)和后四位(月日)拆开看就有如下结论:可以根据4位年份计算出回文数,并判断结果是否合理(符号月日的要求以及平闰年要求),或是将4位月日数字计算出回文数,判断是否有合理的年份。
这里我们选择前一种思路,因为年份是很少很少的,便于计算和判断
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
//实现4位数回文
int huiwen(int year){
    int n=4;
    int a=year%10;
    int b=year/10%10;
    int c=year/100%10;
    int d=year/1000%10;
    return a*1000+b*100+c*10+d;
}
//判断闰年
bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//判断合理性
bool isValidDate(int year) {
    int huiwenyear=huiwen(year);
    int day=huiwenyear%10+(huiwenyear/10%10)*10;
    int month=huiwenyear/100%10+(huiwenyear/1000%10)*10;
    if (month < 1 || month > 12) return false;
    int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (isLeap(year)) daysInMonth[2] = 29;
    return day >= 1 && day <= daysInMonth[month];
}
int main(){
    cin>>s1>>s2;
    int cnt=0;
    int year1 = stoi(s1.substr(0, 4));
    int year2 = stoi(s2.substr(0, 4));
    for(int i=year1;i<=year2;i++){
        if(isValidDate(i)) cnt++;
    }
    cout<<cnt;
}
但是令我没有想到的是我在字符串和数字转换的欠缺如此之大,当时写这段代码时候一直学一些新的东西,比如很多字符串的内置函数我压根没有见过,类型强制转换用的也很不精。如substr()函数,还有stoi()函数,即string to int的缩写。希望这些函数在学习的过程中不断积累。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务