目录
题目链接
编辑
编辑
什么是回文数?编辑
代码
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;
}