PAT 乙级题目讲解:1017《A除以B》

📅 2026/7/4 8:50:26
PAT 乙级题目讲解:1017《A除以B》
✅ PAT 乙级题目讲解1017《A除以B》摘要本文深入讲解 PAT 乙级 1017 题《A除以B》的求解方法通过字符串逐位处理模拟大整数除以一位正整数。文章涵盖题目简介、样例分析、解题思路拆解、完整 C 代码、常见错误提醒、复杂度分析及思维拓展系统梳理了高精度除法的核心要点。 题目简介给定两个正整数AAA和BBB其中AAA是不超过1000 位的超大正整数BBB是一位正整数。要求输出商数QQQ和余数RRR使得AB×QRA B \times Q RAB×QR成立。由于AAA过大无法使用常规整型变量处理因此需使用字符串进行逐位除法模拟。 样例分析输入样例 1123456789050987654321 7模拟除法操作逐位计算商数高位不足除以777继续与下一位拼接直到被除数大于等于777可计算一位商并更新余数。逐步竖式模拟除法过程位次 i当前位 t商 q[i]余数 r010111215253743446242534…………最终商Q17636684150141093474Q 17636684150141093474Q17636684150141093474余数R3R 3R3。输出17636684150141093474 3 解题思路本题属于大整数除法模拟问题整体流程如下将超大整数AAA以字符串形式读入转成整型数组处理定义初始余数r0r 0r0从左至右逐位处理字符型数字模拟“手算除法”过程当前数位参与计算的值为r×10当前数字r \times 10 当前数字r×10当前数字当前位商为⌊r×10当前数字B⌋\left\lfloor \frac{r \times 10 当前数字}{B} \right\rfloor⌊Br×10当前数字​⌋更新余数为上式的模所有位处理完成后输出拼接得到的商QQQ与最终余数RRR。 变量说明变量名数据类型含义astring高精度被除数 Ana[]int[]A 拆分后的每一位数字bint除数tint当前处理的除数段值rint上一步余数q[]int[]商的每一位kint商的首个非零位索引✅ Step 1读取与预处理输入用字符串读入大整数AAA用整型变量读入BBB将字符串逐位转为整型数组na[]。string a;intna[1005],b,t,r,q[1005];...// 1. 把 a - na[i]intlena.size();for(inti0;ilen;i){na[i]a[i]-0;}✅ Step 2模拟除法过程对AAA的每一位进行以下操作构造当前被除数段tr×10na[i]t r \times 10 na[i]tr×10na[i]计算当前位商q[i]t÷bq[i] t \div bq[i]t÷b更新余数rt mod br t \bmod brtmodb。// 2. for 逐位模拟计算 - q[i]for(inti0;ilen;i){tr*10na[i];// 当前被除数段q[i]t/b;// 当前位商rt%b;// 余数}✅ Step 3去除前导零并输出从q[0]q[0]q[0]开始找到第一个非 0 的位置kkk从q[k]q[k]q[k]到q[len−1]q[len-1]q[len−1]依次输出最后输出空格和余数rrr。// 3. 去前导 0intk0;while(!q[k]klen-1){k;}// 4. 输出for(intik;ilen;i){coutq[i];}cout r;✅ 完整代码#includebits/stdc.husingnamespacestd;string a;intna[1005],b,t,r,q[1005];intmain(){cinab;// 1. 把 a - na[i]intlena.size();for(inti0;ilen;i){na[i]a[i]-0;}// 2. for 逐位模拟计算 - q[i]for(inti0;ilen;i){tr*10na[i];q[i]t/b;rt%b;}// 3. 去前导 0intk0;while(!q[k]klen-1){k;}// 4. 输出for(intik;ilen;i){coutq[i];}cout r;return0;} 常见错误提醒错误类型具体表现用int读入AAA大整数溢出程序崩溃或输出错误商数前导零未处理输出以0001...开头不符合题目要求商数拼接逻辑错误未正确更新每一位q[i]q[i]q[i]或遗漏输出忽略余数输出最终输出漏掉余数RRR✅ 总结归纳 核心方法总结高精度除法的竖式模拟商数数组逐位构建余数逐步更新传递。 技术要点回顾使用字符串 数组存储超大整数手动模拟除法的每一位除、余过程去除前导 0 的实现技巧。 复杂度分析时间复杂度O(n)\mathcal{O}(n)O(n)空间复杂度O(n)\mathcal{O}(n)O(n)其中nnn为大整数AAA的位数最长 1000 位。 思维拓展扩展到支持小数除法输出若干位小数实现高精度加减乘除统一框架封装为高精度类支持多种运算符重载。