高精度运算
高精度运算
高精度的加法、减法、乘法;高精度整数除以单精度整数的商和余数。
概念
当整数超出 long long 范围(约 ±9×10¹⁸),或题面明确要求「任意精度」,就要用数组或字符串按位存储十进制数字,并模拟竖式运算。加法、减法从低位到高位,维护进位或借位;乘法是「一位乘整串再加移位」;除以单精度整数则逐位试商得商和余数。本叶子只覆盖 CSP-J 大纲列出的四则形态,不涉及 Karatsuba 等高级算法。与 cspj.math.number-and-base(进制转换)相邻:高精度常按十进制存,但思想与按权展开相同;与 cspj.cpp.string 相邻:实现常借字符串读入再倒序存数组。
CSP-J 常考
目前语料只有 1 道:
cspj-r1-2023第 7 题:单选题,判断高精度存储、进位或运算步骤相关说法。
// 高精度加(a、b 为倒序存位的 vector<int>,a[0] 是个位)
vector<int> add(const vector<int>& a, const vector<int>& b) {
vector<int> c;
int carry = 0;
for (size_t i = 0; i < a.size() || i < b.size() || carry; ++i) {
int s = carry;
if (i < a.size()) s += a[i];
if (i < b.size()) s += b[i];
c.push_back(s % 10);
carry = s / 10;
}
return c;
}
易错点
- 数字存序搞反:输入
"123"常要倒序存{3,2,1},输出前再反转。 - 减法前未保证被减数 ≥ 减数,或未处理前导零。
- 乘法累加时忘记加「错位」的进位层,或除以单精度时余数参与下一轮的方式写错。
以下关于高精度运算的说法错误的是()