[题目链接](https://www.luogu.com.cn题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入
1
2
输出
2
说明/提示
每个数字不超过 10^2000,需用高精。/problem/P1303)
就是一道高精乘的模板题;
最主要的思想就是模仿乘法的竖式运算。
就是数A的每一位乘上数B的每一位,然后再进位。
其实也没什么好讲的
直接上代码。
#include<iostream>
#include<string.h>
using namespace std;
const int ll = 10000;
char a[ll], b[ll], cun[ll];
int ans[ll];
int main() {
memset(ans, 0, sizeof(ans));
cin >> a + 1;
//char c = getchar();
cin >> b + 1;
char c = getchar();
int lena = strlen(a+1), lenb = strlen(b+1);
//首先将用char型数组存的字符减去‘0’
//然后再将数组倒过来,这里借用第三个数组cun来进行操作。
for (int i = 1; i <= lena; i++) {
a[i] -= '0';
cun[i] = a[i];
}
for (int i = 1; i <= lena; i++)
a[i] = cun[lena - i+1];
for (int i = 1; i <=lenb; i++) {
b[i] -= '0';
cun[i] = b[i];
}
for (int i = 1; i <=lenb; i++)
b[i] = cun[lenb - i+1];
//两重循环,用数A的第i位和数B的第j位相乘,结果应该是在第i+j-1位。
for (int i = 1; i <=lena; i++) {
for (int j = 1; j <=lenb; j++) {
int k = i + j - 1;
int x = a[i] * b[j];
ans[k] += x;
}
//每一位上的数字逢十就进位
for (int j = 1; j <= lena + lenb - 1; j++) {
ans[j + 1] += (ans[j] / 10);
ans[j] %= 10;
}
}
//一个长度为lena的数和一个长度为lenb的数相乘,结果是一个长度为
//lena+lenb-1或者lena+lenb的数。
int len = lena + lenb - 1;
if (ans[len + 1])
len = len + 1;
//删除结果高位的前导零
while (ans[len] == 0&&len>1)
len--;
for (int i = len; i >= 1; i--)
cout << ans[i];
return 0;
}