C++ 高精度乘法运算

思想

首先确定乘积的位数。

假设两个非负整数a和b,n1为a的长度(位数),n2为b的位数,记n为c=a*b的位数,则有:

$$ n\le n_1+n_2 $$

计算两个乘数每位数字的乘积,其中a[i]乘b[j]累加到c[i+j]上去

在最后对累加结果数组c作一次性进位(判断是否大于等于10)

代码

知道上述原理,很容易就写出代码

#include <iostream>
#include <string>
#include <algorithm>
#include <string.h>

using namespace std;
int main()
{
    //输入时处理,包含置0、逆置、转换成真实数字等步骤
    string s;
    cin >> s;
    int n1 = s.length();    //长度
    char str1[10];
    memset(str1, 0, sizeof(str1));
    for (int i = 0; i < n1;i++)
        str1[i] = s[n1 - i - 1]-'0';
    
    string s2;
    cin >> s2;
    int n2 = s2.length();
    char str2[10];
    memset(str2, 0, sizeof(str2));
    for (int i = 0; i < n2;i++)
        str2[i] = s2[n2 - i - 1]-'0';


    char res[20];
    memset(res, 0, sizeof(res));

    //核心代码
    int i, j;
    for (i = 0; i < n1;i++)
        for (j = 0; j < n2;j++)
            res[i + j] += str1[i] * str2[j];

    for (i = 0; i < n1 + n2;i++)
    {
        if(res[i]>=10)
        {
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }

    }

    //从不为0的那一位开始输出(删除前导0),如果全部为0,则输出0
    int k;
    for (k = n1 + n2 - 1; !res[k]&&k>0; k--)
        ;   //注意这个分号

    for (int i = k; i >= 0; i--)
        cout << int(res[i]);
    cout << endl;


    return 0;
}
最后修改:2023 年 01 月 10 日
如果觉得我的文章对你有用,请随意赞赏