
题目链接P1303 A*B Problem - 洛谷这是高精乘法模板题目#includebits/stdc.h using namespace std; int main() { string s1,s2; cin s1 s2; if(s1 0 || s2 0) { cout 0; return 0; } int n s1.size(),m s2.size(); vectorint ans(n m); for(int i 0;i n;i) for(int j 0;j m;j) ans[ij] (s1[n-1-i] - 0)*(s2[m-1-j] - 0); for(int i 0;i nm-1;i) { ans[i1] ans[i] / 10; ans[i] % 10; } int top n m - 1; while(ans[top] 0) top--; for(int i top;i 0;i--) cout ans[i]; return 0; }首先a的位数是n b的位数是m那么a*b结果位数不大于 nm原因是位数本质上等于“这个数在 10 的幂之间哪一格”n 位数的范围10^(n-1) ≤ A 10^nm 位数的范围10^(m-1) ≤ B 10^m两边相乘plaintext10^(nm-2) ≤ A×B 10^(nm)所以A×B的范围是下界10^(nm-2)是一个nm-1位数因为 10ᵏ 是 k1 位数上界10^(nm)是nm1位数但注意是A×B 10^(nm)严格小于所以A×B最多是10^(nm) − 1那是nm位数。结论A×B的位数在nm-1到nm之间取最大就是nm。接着就是模拟我们手动乘法的过程哪一位和哪一个相乘落在哪一位....唯一不同的是我们算出的是每一位乘后的和之后再同一的进位处理就好了