PAT 乙级题目讲解:1016《部分A+B》
✅ PAT 乙级题目讲解:1016《部分A+B》
🧩 题目简
题目摘要:本题目要求从两个正整数中分别提取指定数字并拼接成新整数,计算其和。核心考察字符串提取与数字构造的模拟实现,时间复杂度O(n)\mathcal{O}(n)O(n),空间复杂度O(1)\mathcal{O}(1)O(1)。适合入门练习数位拆分与拼接技巧。
介
本题考查的是字符串提取 + 数字构造的模拟实现问题。
给定两个正整数AAA和BBB,以及两个数字DAD_ADA和DBD_BDB。我们需要从AAA中提取出所有为DAD_ADA的数字,并按原顺序拼接成一个新整数PAP_APA;同理从BBB中提取出所有为DBD_BDB的数字,拼接成PBP_BPB,并输出PA+PBP_A + P_BPA+PB。
🧪 样例分析
输入样例 1:
3862767 6 13530293 3- A=3862767,DA=6A = 3862767, D_A = 6A=3862767,DA=6→ 提取出数字 6,PA=66P_A = 66PA=66。
- B=13530293,DB=3B = 13530293, D_B = 3B=13530293,DB=3→ 提取出数字 3,PB=33P_B = 33PB=33。
- 输出PA+PB=66+33=99P_A + P_B = 66 + 33 = 99PA+PB=66+33=99。
输出:
99输入样例 2:
3862767 1 13530293 8- AAA中没有数字 1,PA=0P_A = 0PA=0。
- BBB中没有数字 8,PB=0P_B = 0PB=0。
- 输出0+0=00 + 0 = 00+0=0。
输出:
0🔍 解题思路
📎 变量说明
| 变量名 | 数据类型 | 含义 |
|---|---|---|
a | int | 输入的整数AAA |
da | int | 要提取的数字DAD_ADA |
b | int | 输入的整数BBB |
db | int | 要提取的数字DBD_BDB |
p | int | 计算得出的新整数PAP_APA或PBP_BPB |
✅ Step 1:读取输入数据
从输入中读取整数AAA和BBB以及它们对应的数字DAD_ADA和DBD_BDB。
cin>>a>>da>>b>>db;✅ Step 2:定义函数p(x, dx)提取部分数字
定义一个函数p来提取给定整数xxx中所有为dxdxdx的数字,并拼接成一个新整数。
intp(intx,intdx){intpx=0;while(x){if(x%10==dx){px=px*10+dx;}x/=10;}returnpx;}- 每次从xxx中提取最低位数字,如果数字等于dxdxdx,就拼接到
px上; - 最后返回拼接得到的结果。
✅ Step 3:计算并输出PA+PBP_A + P_BPA+PB
通过调用p(a, da)和p(b, db)分别得到PAP_APA和PBP_BPB,然后输出它们的和。
cout<<p(a,da)+p(b,db);✅ 完整代码
#include<bits/stdc++.h>usingnamespacestd;inta,da,b,db;intp(intx,intdx){intpx=0;while(x){if(x%10==dx){px=px*10+dx;}x/=10;}returnpx;}intmain(){cin>>a>>da>>b>>db;cout<<p(a,da)+p(b,db);}🚧 常见错误提醒
| 错误类型 | 具体表现 |
|---|---|
| 字符串提取错误 | 提取数字时未按正确顺序拼接,导致结果错误 |
| 输出格式错误 | 输出时未按照题目要求格式打印,可能丢失空格或换行 |
✅ 总结归纳
📌 核心方法总结
通过字符串提取模拟提取数字,使用数位拆分和重组来拼接结果。
📋 技术要点回顾
- 数位拆分与拼接的标准方法;
- 数字匹配与提取技巧;
- 避免溢出的边界条件处理。
📊 复杂度分析
- 时间复杂度:O(n)\mathcal{O}(n)O(n)
- 空间复杂度:O(1)\mathcal{O}(1)O(1)
其中nnn为输入数据中最大数字的位数(最多 9 位)。
🧠 思维拓展
- 扩展思考:如果题目要求提取数字并按奇偶性筛选拼接,该如何实现?
- 类似题目:数字构造类问题,如回文数判断、数字逆序等;
- 其他思路:可将函数
p中的数位提取改为直接使用字符串操作。
