目录
题目链接
编辑
编辑
什么是回文数?编辑
代码
100%过
90%暴力
优化写的暴力代码
题目链接
2.回文日期 - 蓝桥云课 (lanqiao.cn)
什么是回文数?
代码
100%过
把那个90%的代码的循环限制条件去掉就行了,题目只是限制了N的范围,没说输出的日期也是在这个范围里。
#include <bits/stdc++.h>
using namespace std;bool check(int y,int m,int d) {if(y<0 || m<1 || m>12 || d<1) {return false;}int m_d[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};if((y%4==0 && y%100 !=0) || y%400==0) {m_d[2]=29;}if(d>m_d[m]) {return false;}return true;
}bool check2(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5) {return true;}return false;
}bool check3(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5 && a2==a4 && a1==a3) {return true;}return false;
}int main() {int n;cin>>n;for(int i=n+1; ; i++) {int year=i/10000;int month=i%10000/100;int day=i%100;if(check(year,month,day)) { //判断符不符合日期的基本要求if(check2(year,month,day)) {printf("%d%02d%02d\n",year,month,day);break;}}}for(int i=n+1; ; i++) {int year=i/10000;int month=i%10000/100;int day=i%100;if(check(year,month,day)) { //判断符不符合日期的基本要求if(check3(year,month,day)) {printf("%d%02d%02d\n",year,month,day);break;}}}return 0;
}
90%暴力
好冗长。。。。。。。哪里错了呢?
#include <bits/stdc++.h>
using namespace std;bool check(int y,int m,int d) {if(y<0 || m<1 || m>12 || d<1) {return false;}int m_d[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};if((y%4==0 && y%100 !=0) || y%400==0) {m_d[2]=29;}if(d>m_d[m]) {return false;}return true;
}bool check2(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5) {return true;}return false;
}bool check3(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5 && a2==a4 && a1==a3) {return true;}return false;
}int main() {int n;cin>>n;for(int i=n+1; i<=89991231; i++) {int year=i/10000;int month=i%10000/100;int day=i%100;if(check(year,month,day)) { //判断符不符合日期的基本要求if(check2(year,month,day)) {printf("%d%02d%02d\n",year,month,day);break;}}}for(int i=n+1; i<=89991231; i++) {int year=i/10000;int month=i%10000/100;int day=i%100;if(check(year,month,day)) { //判断符不符合日期的基本要求if(check3(year,month,day)) {printf("%d%02d%02d\n",year,month,day);break;}}}return 0;
}
优化写的暴力代码
利用flag,判断check2的同时判断flag是否是flase,如果是的话才进入,打印出一个普通回文数后,flag记为true,下次就不会再进入了。这样的话不用再写一遍for
if(check2(year,month,day) && flag==false) {//该部分目的是输出第一个回文日期,flag作为标记。
//当找到第一个回文日期之后,将flag变为ture。这样下一次碰到普通回文日期时就不会输出。printf("%d%02d%02d\n",year,month,day);flag=true;
}
当然,check2和check3也可以放在主函数里写,这样a1~a8就写一次就够了。
#include <bits/stdc++.h>
using namespace std;bool check(int y,int m,int d) {if(y<0 || m<1 || m>12 || d<1) {return false;}int m_d[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};if((y%4==0 && y%100 !=0) || y%400==0) {m_d[2]=29;}if(d>m_d[m]) {return false;}return true;
}bool check2(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5) {return true;}return false;
}bool check3(int y,int m,int d) {int a1=y/1000;int a2=y%1000/100;int a3=y%100/10;int a4=y%10;int a5=m/10;int a6=m%10;int a7=d/10;int a8=d%10;if(a1==a8 && a2==a7 && a3==a6 && a4==a5 && a2==a4 && a1==a3) {return true;}return false;
}int main() {int n;cin>>n;bool flag=false;for(int i=n+1; ; i++) {int year=i/10000;int month=i%10000/100;int day=i%100;if(check(year,month,day)) { //判断符不符合日期的基本要求if(check2(year,month,day) && flag==false) {//该部分目的是输出第一个回文日期,flag作为标记。//当找到第一个回文日期之后,将flag变为ture。这样下一次碰到普通回文日期时就不会输出。printf("%d%02d%02d\n",year,month,day);flag=true;}if(check3(year,month,day)) { //输出ABABBABA型的回文日期printf("%d%02d%02d\n",year,month,day);break;}}}return 0;
}