蓝桥-回文日期

目录

题目链接

​编辑

​编辑

什么是回文数?​编辑

代码 

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;
}

相关推荐

  1. 杯题目-日期

    2024-04-07 19:24:03       67 阅读
  2. [杯 2016枚举]日期

    2024-04-07 19:24:03       52 阅读
  3. 判断-

    2024-04-07 19:24:03       67 阅读
  4. 杯求解数(栈求解版本)

    2024-04-07 19:24:03       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 19:24:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 19:24:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 19:24:03       87 阅读
  4. Python语言-面向对象

    2024-04-07 19:24:03       96 阅读

热门阅读

  1. leetcode热题100.数组中的第k大的元素

    2024-04-07 19:24:03       38 阅读
  2. [leetcode] 66. 加一

    2024-04-07 19:24:03       35 阅读
  3. GPU的了解

    2024-04-07 19:24:03       47 阅读
  4. Redis实现网站访问人数统计

    2024-04-07 19:24:03       44 阅读
  5. 设计模式:观察者模式

    2024-04-07 19:24:03       44 阅读
  6. 全量知识系统 设计和实现的切入点探讨 (Q&A)

    2024-04-07 19:24:03       36 阅读
  7. 数据库面试题之Mysql

    2024-04-07 19:24:03       38 阅读
  8. Django--方法

    2024-04-07 19:24:03       40 阅读