【蓝桥真题】 回文日期

题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。

因为如果将这个日期按 yyyymmdd 的格式写成一个 8 位数是 20200202,恰好是一个回文数。

我们称这样的日期是回文日期。

有人表示 20200202 是“千年一遇” 的特殊日子。

对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。

对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。

算不上“千年一遇”,顶多算“千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

注意:下一个回文日期和下一个 ABABBABA 型的回文日期可能是同一天。

ABABBABA 型的回文日期,需要满足 A≠B。

输入格式
输入包含一个八位整数 N,表示日期。

输出格式
第一行表示下一个回文日期,
第二行表示下一个 ABABBABA 型的回文日期。

输入样例
20200202

输出样例
20211202
21211212

数据范围
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数表示。

解题思路
枚举年份a,将其反转得到b,a+b得到一个回文数
用substr分离出月份和天数,在判断月份和天数是否合法;

代码

#include <iostream>
#include <algorithm>
using namespace std;

int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int year)
{
	return year % 400 == 0 || year % 4 == 0 && year % 100 != 0; //闰年2月多一天
}

int get_day(int year, int month)
{
	if(month == 2) return 28 + check(year);
	return days[month];
}

int main()
{
	int n;
	cin >> n;
	
	string ans1, ans2;  //ans1回文数 ans2为ababbaba形回文数
	bool flag1 = false, flag2 = false; //两个哨兵
	for (int i = n / 10000; i <= 9999; i ++) //枚举年份
	{
		string a = to_string(i); //to_string整转字
		string b = a; 
		reverse(b.begin(), b.end()); //反转b
		if(a + b <= to_string(n)) continue; //得到日期需大于输入日期
		
		int month = stoi(b.substr(0, 2)); //stoi字转整 substr分理出月份和天
		int day = stoi(b.substr(2, 2));
		if(month < 1 || month > 12) continue; //判断是否合法
		if(day < 1 || day > get_day(i, month)) continue;
		
		string s1 = a.substr(0, 2); //作为判断ababbaba型
		string s2 = a.substr(2, 2);
		if(!flag1) ans1 = a + b, flag1 = true;
		if(!flag2 && s1 == s2 && s1[0] != s1[1]) ans2 = a + b, flag2 = true; //判断ababbaba型

		if(flag1 && flag2) break; //得到两个回文数结束循环
	}
	
	cout << ans1 << endl;
	cout << ans2 << endl;
	return 0;
}
<think>好的,我现在需要处理用户关于蓝桥杯竞赛中浮点数处理的真题或解法的请求。首先,我要确认用户的具体需求:他们可能在寻找蓝桥杯真题中涉及浮点数处理的题目,以及相应的解决方法。接下来,我需要回忆蓝桥杯的常见题型,尤其是Python组的题目,因为用户提供的引用中提到了Python组的情况。 根据引用[1]和[2],蓝桥杯青少组和省赛的题目难度适中,但需要扎实的基础。浮点数处理通常涉及精度控制、四舍五入、避免累积误差等问题。常见的考点可能包括格式化输出、小数运算技巧、比较浮点数时的注意事项等。 我需要先整理几个典型的蓝桥杯浮点数处理题目。例如,可能存在要求计算特定数学问题并保留小数位数的情况,或者处理浮点数的输入输出格式。此外,可能还有涉及避免浮点数计算误差的题目,比如使用整数运算代替浮点数运算来保持精度。 接下来,针对每个题目类型,我需要给出具体的解决方法和代码示例。例如,使用Python的round函数进行四舍五入,或者使用decimal模块处理高精度计算。同时,要注意蓝桥杯竞赛中可能对输出格式的严格要求,比如必须保留两位小数,这时候需要正确的格式化字符串方法。 另外,用户提供的引用中提到,即便是最后一个大题,实现起来也不难,关键在于理解题意并转换为代码。因此,在解答时,可能需要强调问题分析和将问题分解为编程步骤的能力。 最后,生成相关问题时要围绕浮点数处理的不同方面,比如精度控制、运算优化、常见错误等,帮助用户全面了解该考点。</think>### 蓝桥杯浮点数处理真题及方法 #### 典型真题示例 1. **保留小数位数问题** **题目**:计算圆的面积,保留7位小数(输入半径$r$,输出面积$S$)[^1]。 **解法**:使用Python的字符串格式化或`round`函数。 ```python import math r = float(input()) S = math.pi * r ** 2 print("{:.7f}".format(S)) # 直接格式化输出 # 或 print(round(S, 7)) # 注意:round可能末尾补零不足需处理 ``` 2. **浮点数精度陷阱** **题目**:判断两个浮点数$a$和$b$是否相等,若$|a - b| < 1e-9$则认为相等[^2]。 **解法**:避免直接`a == b`,改用误差范围判断。 ```python a = float(input()) b = float(input()) if abs(a - b) < 1e-9: print("相等") else: print("不等") ``` 3. **浮点数运算转整数优化** **题目**:计算浮点数数组平均值,保留两位小数(例如:输入`[1.2, 3.4, 5.6]`,输出`3.40`)。 **解法**:利用整数运算避免累积误差。 ```python nums = list(map(float, input().split())) total = sum(int(x * 100) for x in nums) # 转为分计算 avg = total / len(nums) print("{:.2f}".format(avg / 100)) ``` #### 核心技巧总结 1. **输出格式化** - 使用`format`函数:`"{:.Nf}".format(x)`保留$N$位小数。 - 注意补零:如要求必须显示两位小数,即使末尾是零(例如`3.4`需输出`3.40`)。 2. **高精度计算** - 需要精确小数时,用`decimal`模块: ```python from decimal import Decimal, getcontext getcontext().prec = 20 # 设置精度位数 result = Decimal('0.1') + Decimal('0.2') # 精确计算0.3 ``` 3. **避免浮点误差** - 比较时用误差阈值(如`1e-9`)。 - 涉及货币、分数时,优先转为整数计算(如以分为单位)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值