[特殊字符] 2025蓝桥杯备赛Day14——P8752 [蓝桥杯 2021 省 B2] 特殊年份
🔍 2025蓝桥杯备赛Day14——P8752 [蓝桥杯 2021 省 B2] 特殊年份
P8752 [蓝桥杯 2021 省 B2] 特殊年份
题目描述
今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1 1 1,我们称满足这样条件的年份为特殊年份。
输入 5 5 5 个年份,请计算这里面有多少个特殊年份。
输入格式
输入 5 5 5 行,每行一个 4 4 4 位十进制数(数值范围为 1000 1000 1000 至 9999 9999 9999),表示一个年份。
输出格式
输出一个整数,表示输入的 5 5 5 个年份中有多少个特殊年份。
输入输出样例 #1
输入 #1
2019
2021
1920
2120
9899
输出 #1
2
说明/提示
【样例说明】
2021 和 9899 是特殊年份,其它不是特殊年份。
蓝桥杯 2021 第二轮省赛 B 组 F 题。
🛠️ 解法一:字符串解析法(高效竞赛写法)
🔥 核心思路
直接通过 字符串索引 访问各位字符,利用 ASCII码运算 简化逻辑。无需数学计算,适合竞赛快速编码。
📝 代码实现
#include <iostream>
using namespace std;
int main() {
int ans = 0;
for (int i = 0; i < 5; ++i) {
string s;
cin >> s;
// 千位s[0] == 十位s[2] 且 个位s[3] == 百位s[1]+1
if (s[0] == s[2] && s[3] == s[1] + 1)
ans++;
}
cout << ans << endl;
return 0;
}
🌟 代码解析
-
字符索引
:四位数年份作为字符串输入,索引对应关系:
s = "2021" s[0] → '2' (千位) s[1] → '0' (百位) s[2] → '2' (十位) s[3] → '1' (个位)
-
ASCII码运算:
s[3] == s[1] + 1
等效于数值运算: 个位数值=百位数值+1个位数值=百位数值+1
✅ 优势
- ⚡ 高效快速:无复杂计算,直接访问字符
- 📉 低内存消耗:无需额外存储结构
- 🎯 代码简洁:适合竞赛场景快速实现
🛠️ 解法二:数值拆解法(直观数学思路)
🔥 核心思路
通过 数学运算 分解四位数,逐位提取数值。逻辑清晰,适合教学或理解位数处理原理。
📝 代码实现
#include <iostream>
using namespace std;
int main() {
int ans = 0;
for (int i = 0; i < 5; ++i) {
int year;
cin >> year;
// 数学拆解各位数值
int thousand = year / 1000; // 千位
int hundred = (year / 100) % 10; // 百位
int ten = (year / 10) % 10; // 十位
int one = year % 10; // 个位
// 判断条件
if (thousand == ten && one == hundred + 1)
ans++;
}
cout << ans << endl;
return 0;
}
🌟 代码解析
- 数值拆解公式:
千位=⌊year1000⌋
百位=⌊year100⌋%10
十位=⌊year10⌋% 10
个位=year% 10
✅ 优势
- 📚 逻辑直观:明确展示数学拆解过程
- 🔧 扩展性强:适用于需要灵活处理位数的变种题
- 📖 教学友好:适合初学者理解位数运算原理
⚖️ 双解法对比
维度 | 字符串解析法 | 数值拆解法 |
---|---|---|
运算效率 | ⚡ 更优(无除法/取模) | ⏳ 稍慢(需多次数学运算) |
代码可读性 | 🧠 需理解ASCII码运算 | 📊 直观展示数学逻辑 |
适用场景 | 🏆 竞赛快速解题 | 🎓 教学/需明确数学逻辑 |
内存占用 | 💾 O(1) | 💾 O(1) |
🔍 测试用例验证
📥 输入样例
2019 → 2≠1 ❌
2021 → 2=2 ✔️, 1=0+1 ✔️
1920 → 1≠2 ❌
2120 → 2=2 ✔️, 0≠1+1 ❌
9899 → 9=9 ✔️, 9=8+1 ✔️
📝 总结与扩展
🚀 性能优化技巧
-
输入加速
(C++):
ios::sync_with_stdio(false); // 关闭同步流 cin.tie(0); // 解除cin与cout绑定
-
防御性编程
:
if (s.length() != 4) { // 确保输入合法性 cerr << "Invalid input!"; continue; }
💡 举一反三
- 变种题1:若条件改为“百位等于个位且千位比十位大2”,如何修改代码?
- 变种题2:若年份为五位数或六位数,数值拆解法如何调整?
📚 附录:四位数拆解公式表
数位 | 数学公式 | 示例(2021) |
---|---|---|
千位 | year / 1000 | 2021/1000=2 |
百位 | (year / 100) % 10 | (2021/100)=20 → 20%10=0 |
十位 | (year / 10) % 10 | (2021/10)=202 → 202%10=2 |
个位 | year % 10 | 2021%10=1 |
竞赛场景优先字符串解析法,追求极致效率;
教学场景推荐数值拆解法,深入理解数学逻辑。