链接[NOIP2016]回文日期来源牛客网题号NC16438时间限制C/C/Rust/Pascal 1秒其他语言2秒空间限制C/C/Rust/Pascal 256 M其他语言512 M64bit IO Format: %lld题目描述在日常生活中通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用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位数字。 第一行表示牛牛指定的起始日期。 第二行表示牛牛指定的终止日期。 保证datei和都是真实存在的日期且年份部分一定为4位数字且首位数字不为0。 保证date1 —定不晚于date2。输出描述:输出一行包含一个整数表示在date1和date2之间有多少个日期是回文的。示例1输入复制20110101 2011123120110101 20111231输出复制11说明符合条件的日期是20111102。示例2输入复制20000101 2010123120000101 20101231输出复制22说明符合条件的日期是20011002和20100102。备注:对于60%的数据满足date1 date2。代码#include iostream using namespace std; static int cnt 0; static int M[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool isVaildDate(int i) { int kesaiy i/10000; // int kesaim i/100 - 100*(i/10000); //其实直接就是 (i/100)%100 int kesaim (i/100)%100; int kesaid i%100; if(kesaim 12 || kesaim 1) {//看月是否规范 return false; }else {//看日是否规范 //分是2与不是2俩部分看 if(kesaim ! 2) { if(kesaid M[kesaim] (kesaid 1)) return true; return false; } else { //29时就单独看 //不是29就是常规情况了 if(kesaid 29) { if( (kesaiy%4 0 kesaiy%100 ! 0) || kesaiy%4000) { return true; } else { return false; } } else { if(kesaid M[kesaim] (kesaid 1)) return true; return false; } } } } void isHuiWenAndOper(int i) { //判断是否是合法的日期 if(!isVaildDate(i)) return; //判断是不是回文是就cnt if( (i/10000000 ! (i/1 - 10*(i/10) ) ) || (i/1000000 - 10*(i/10000000) ! (i/10 - 10*(i/100) )) || (i/100000 - 10*(i/1000000) ! (i/100 - 10*(i/1000) )) || (i/10000 - 10*(i/100000) ! (i/1000 - 10*(i/10000) )) ) { return; } else { cnt; } } int main() { int n1, n2; cin n1 n2; for(int i n1; i n2; i) { isHuiWenAndOper(i); } cout cnt; return 0; }备注字符展开没有做出来过来置换这道题了里面的年月日本身还有在数位值取时都是类似linux中权限的观点去看的这里的isHuiWenAndOper的函数编写时借鉴了数据结构中树的递归模式的那套写法kesai这种的命名风格时套用高等数学中积分部分的风格整体代码采用c想到C中内存管理部分的知识还有按一边展开慢慢推演在解题时给了我很大的帮助推演的开始借鉴了数据建模时借用的递归思想套用个人开始在符号使用时一直时误用后来30%通过用例后发现问题并调回来学识来自网络资源
阅读完成 · 觉得有帮助?