PAT 乙级题目讲解:1016《部分A+B》

PAT 乙级题目讲解:1016《部分A+B》

✅ PAT 乙级题目讲解:1016《部分A+B》


🧩 题目简

题目摘要:本题目要求从两个正整数中分别提取指定数字并拼接成新整数,计算其和。核心考察字符串提取与数字构造的模拟实现,时间复杂度O(n)\mathcal{O}(n)O(n),空间复杂度O(1)\mathcal{O}(1)O(1)。适合入门练习数位拆分与拼接技巧。

本题考查的是字符串提取 + 数字构造的模拟实现问题。

给定两个正整数AAABBB,以及两个数字DAD_ADADBD_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

🔍 解题思路

📎 变量说明

变量名数据类型含义
aint输入的整数AAA
daint要提取的数字DAD_ADA
bint输入的整数BBB
dbint要提取的数字DBD_BDB
pint计算得出的新整数PAP_APAPBP_BPB

✅ Step 1:读取输入数据

从输入中读取整数AAABBB以及它们对应的数字DAD_ADADBD_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_APAPBP_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中的数位提取改为直接使用字符串操作。