P1303 A*B Problem题目链接P1303 A*B Problem - 洛谷解法模拟列竖式过程。1先用字符串读入然后拆分每一位逆序放在数组中。这个步骤原理看前面博客代码一样#includeiostream #includestring using namespace std; const int N 1e6 10; int a[N], b[N], c[N]; int la, lb, lc; int main() { string x, y; cin x y; //拆分每一位逆序放到数组中 la x.size(); lb y.size(); lc la lb;//lc最大位数是二者之和比如99*99是四位数而一定不为5位数 for (int i 0; i la; i) { a[la - i - 1] x[i] - 0;//x[i]为数字字符 } for (int i 0; i lb; i) { b[lb - i - 1] y[i] - 0; } //模拟乘法的过程 mul(c, a, b);//ca*b; //输出结果 for (int i lc - 1; i 0; i--) { cout c[i]; } return 0; }主要注意的是lc不是max(la,lb)了因为实际上两个数相乘最终结果肯定小于等于二者位数之和2利用数组模拟列竖式乘法的过程我们知道如果123*456那么就是这样乘得到结果因为我们进位所以123*6的结果是738但是如果我们不进位则直接变成了600 120 18这样好像更好了我们如果使用小学列竖式的方法进位那么我们需要分很多情况讨论实际上我们完全可以不进位先把该位置上的结果保留下来最后再一起进位变成这种形式所以我们可以这样写出代码记得处理前导0的结果如果是乘以0则结果为0因为题目说了为非负数是可以包含0的#includeiostream #includestring using namespace std; const int N 1e610; int a[N], b[N], c[N]; int la, lb, lc; //高精度乘法的模版- ca*b void mul(int c[], int a[], int b[]) { //无进位相乘然后相加 //使用两个for循环即可 for (int i 0; i la; i) { for (int j 0; j lb; j) { //第c[ij]位置即为乘出来的位置 c[i j] a[i] * b[j];//是。因为我们是把每个位置的乘法结果相加的 } } //处理进位 //使用for循环遍历即可 for (int i 0; i lc; i) { c[i 1] c[i] / 10; c[i] % 10; } //处理前导零 while (lc 1 c[lc - 1] 0) { --lc; } } int main() { string x, y; cin x y; //拆分每一位逆序放到数组中 la x.size(); lb y.size(); lc la lb;//lc最大位数是二者之和比如99*99是四位数而一定不为5位数 for (int i 0; i la; i) { a[la - i - 1] x[i] - 0;//x[i]为数字字符 } for (int i 0; i lb; i) { b[lb - i - 1] y[i] - 0; } //模拟乘法的过程 mul(c, a, b);//ca*b; //输出结果 for (int i lc - 1; i 0; i--) { cout c[i]; } return 0; }复制过去得到:如果各位想要运行快一点也可以把N改成5000这样运行更快