高精度乘法
原理:数组记录每一位,最后处理进位
计算201*98,则先计算201*8,再计算201*9,逐位相乘。竖式计算。
- 存储201和98,逆序存储到数组里面。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
1 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
8 |
9 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- 逐位相乘,得到结果放到result数组里面,最后处理进位。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
8 |
0 |
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
|
9 |
0 |
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
9 |
16 |
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
- 开始处理进位,从低位到高位。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
... |
|
8 |
9 |
6 |
9 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
... |
|
-
将前导0输出过程中全部剔除
-
代码如下:
#include <iostream>
#include <string>
using namespace std;
#define MAX 10000
int main(void)
{
string s1, s2;
cin >> s1 >> s2;
int len1 = s1.size();
int len2 = s2.size();
int a[MAX] = {0};
int b[MAX] = {0};
int result[MAX * 2] = {0};
for (int i = len1-1, j = 0; i >= 0; i--,j++)
{
a[j] = s1[i] - '0';
}
for (int i = len2-1, j=0; i >= 0; i--,j++)
{
b[j] = s2[i] - '0';
}
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
result[i+j] += a[i]*b[j];
}
}
int len3 = len1+len2;
for (int i = 0; i < len3; i++)
{
if (result[i] > 9)
{
result[i+1] += result[i] / 10;
result[i] %= 10;
}
}
int pos;
for (pos = len3-1; pos > 0; pos--)
{
if (result[pos] == 0) continue;
else break;
}
for (; pos >= 0; pos--)
{
cout<<result[pos];
}
return 0;
}