当前位置: 首页 > article >正文

[特殊字符] 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 ✔️

📝 总结与扩展

🚀 性能优化技巧

  1. 输入加速

    (C++):

    ios::sync_with_stdio(false); // 关闭同步流
    cin.tie(0);                  // 解除cin与cout绑定
    
  2. 防御性编程

    if (s.length() != 4) {       // 确保输入合法性
        cerr << "Invalid input!";
        continue;
    }
    

💡 举一反三

  • 变种题1:若条件改为“百位等于个位且千位比十位大2”,如何修改代码?
  • 变种题2:若年份为五位数或六位数,数值拆解法如何调整?

📚 附录:四位数拆解公式表

数位数学公式示例(2021)
千位year / 10002021/1000=2
百位(year / 100) % 10(2021/100)=20 → 20%10=0
十位(year / 10) % 10(2021/10)=202 → 202%10=2
个位year % 102021%10=1

竞赛场景优先字符串解析法,追求极致效率;
教学场景推荐数值拆解法,深入理解数学逻辑。


http://www.kler.cn/a/613712.html

相关文章:

  • 使用QT画带有透明效果的图
  • Linux 配置NFS服务器
  • 自动化发布工具CI/CD实践Jenkins部署与配置教程
  • 算法 | 2024最新算法:鳑鲏鱼优化算法原理,公式,应用,算法改进研究综述,matlab代码
  • Android Gradle 插件问题:The option ‘android.useDeprecatedNdk‘ is deprecated.
  • 浙江大学|DeepSeek系列专题公开课|第一季|PDF+视频(全)
  • word光标一直闪的解决办法
  • linux协议栈网卡接收数据到tcp缓冲区
  • 3.1go流程控制语句
  • 深度学习笔记19-YOLOv5-C3模块实现(Pytorch)
  • Python 爬虫:一键解锁 3GPP 标准协议下载难题
  • XCode16 在Other LInker Flags中,添加-ld64与不添加,有什么区别?
  • sql-labs靶场 less-1
  • hadoop客户端环境准备
  • Linux Shell 脚本使用YAD工具实现Shell图形化界面
  • SpringSecurity过滤器链:核心过滤器的执行顺序与职责
  • spring security设置多个数据源和登录验证码
  • 故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码
  • MySQL Explain 分析 SQL 执行计划
  • 数据设计(范式、步骤)