每日一题洛谷P8716 [蓝桥杯 2020 省 AB2] 回文日期c++

方法有挺多的,比如说先枚举日期再判断是不是回文数,或者先枚举回文数再判断日期是否合法等等。

讲一下作者采用的方法。八位数,如果要是回文数,至少应该是ABCDDBCA,A有9种,B、C、D有10种,所以最多只要枚举9*10*10*10个数字就能出答案。

cpp 复制代码
#include<iostream>
using namespace std;
bool DAY(int n) {
	int year = n / 10000;
	int month = (n % 10000) / 100;
	if (month > 12 || month < 1)return false;
	int day = n % 100;
	if (day > 31 || day < 1)return false;
	if (month == 2 || month == 4 || month == 6 || month == 9 || month == 11) {
		if (day > 30)return false;
	}
	int flag = 0;
	if (year % 100 != 0) {
		if (year % 4 == 0)flag = 1;
	}
	else {
		if (year % 400 == 0)flag = 1;
	}
	if (!flag) {
		if (month == 2) {
			if (day > 28)return false;
		}
	}
	return true;
}
int main() {
	int n;
	cin >> n;
	int a = n / 10000000 % 10;
	int b = n / 1000000 % 10;
	int c = n / 100000 % 10;
	int d = n / 10000 % 10;
	while (1) {
		int sum = a * 10000000 + b * 1000000 + c * 100000 + d * 10000 + d * 1000 + c * 100 + b * 10 + a;
		if (sum > n && DAY(sum)) {
			cout << sum << endl;
			break;
		}
		else {
			d++;
			if (d > 9) { d = 0; c++; }
			if (c > 9) { c = 0; b++; }
			if (b > 9) { b = 0; a++; }
		}
	}
	while (1) {
		int sum = a * 10000000 + b * 1000000 + a * 100000 + b * 10000 + b * 1000 + a * 100 + b * 10 + a;
		if (sum > n && DAY(sum)) {
			cout << sum << endl;
			break;
		}
		b++;
		if (b > 9) { b = 0; a++; }
	}
	return 0;
}
相关推荐
weixin_3077791312 分钟前
Redshift SQL搜索表中所有字段的值
数据仓库·sql·算法·云计算·aws
十八岁讨厌编程2 小时前
【算法训练营Day26】动态规划part2
算法·动态规划
爱吃喵的鲤鱼2 小时前
仿muduo库One Thread One Loop主从Reactor模型实践——介绍
linux·c++
智者知已应修善业3 小时前
【C++无数组矩阵对角线平均值保留2位小数】2022-11-18
c语言·c++·经验分享·笔记·算法·矩阵
papership3 小时前
【入门级-算法-6、排序算法: 计数排序】
数据结构·算法·排序算法
pengpeng023 小时前
力扣每日一题 611. 有效三角形的个数
算法·leetcode·职场和发展
2401_840105204 小时前
GESP C++5级 2025年6月编程2题解:最大公因数
数据结构·c++·算法
GUIQU.4 小时前
【QT】高级主题
开发语言·c++·qt
未知陨落4 小时前
LeetCode:56.子集
算法·leetcode·深度优先
PAK向日葵4 小时前
【算法导论】一道涉及到溢出处理的笔试题
算法·面试