首先解释一下我们介绍的高精度乘法的情况:及为一个数是大数(如题目中的A)一个数的普通数(如题目中的B) ,我们仅仅介绍的是此种情况。
具体代码如下(有详细注释和例子):
#include<bits/stdc++.h>
using namespace std;
/*
处理第1位4:
t = 0 * 10 + 4 = 4
res添加4/3=1 → [1]
t更新为4%3=1
处理第2位5:
t = 1 * 10 +5=15
res添加15/3=5 → [1,5]
t更新为15%3=0
处理第3位6:
t = 0 * 10 +6=6
res添加6/3=2 → [1,5,2]
t更新为6%3=0
*/
vector<int> div(vector<int> v1, int v2, int &t) {
vector<int> res;
// 逐位处理被除数的每一位(从最高位开始)
for(int i = 0; i < v1.size(); i++) {
/* 处理第[ i+1 ]位数字的详细过程:
当前余数 t = 前一步的余数 * 10 + 当前位数值
例:处理第1位4时,t = 0 * 10 + 4 = 4 */
t = t * 10 + v1[i]; // 合并前序余数和当前位
// 计算当前位的商(试商结果)
res.push_back(t / v2); // 当前商位 = 临时值 / 除数
// 更新余数用于下一位计算
t = t % v2; // 新余数 = 临时值 % 除数
}
/* 前导零处理流程:
1. 反转数组:将[0,5,2]变成[2,5,0]便于处理末尾零
2. 删除末尾连续的零:变为[2,5]
3. 再次反转恢复正确顺序:最终[5,2] */
reverse(res.begin(), res.end());
while(res.back() == 0 && res.size() != 1)
res.pop_back();
reverse(res.begin(), res.end());
return res;
}
int main() {
string a;
vector<int> v1;
int b, t = 0;
cin >> a >> b;
// 将字符串转换为数字数组(正序存储)
for(char c : a)
v1.push_back(c - '0');
auto res = div(v1, b, t);
// 输出结果
cout << "商:";
for(int num : res) cout << num;
cout << "\n余数:" << t << endl;
return 0;
}
此篇文章参考了acwing算法基础课。