高精度乘法 C++

高精度乘法

原理:数组记录每一位,最后处理进位

计算201*98,则先计算201*8,再计算201*9,逐位相乘。竖式计算。

  1. 存储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
  1. 逐位相乘,得到结果放到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 ...
  1. 开始处理进位,从低位到高位。
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 ...
  1. 将前导0输出过程中全部剔除

    • 就是找到最后一个0,然后逆序输出前面的数字。
  2. 代码如下:

#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;

}
posted @ 2020-11-04 18:41  ArchieYu  阅读(503)  评论(0编辑  收藏  举报