A*B Problem(高精度)

题目

我们要做高精度的a*b,就要知道怎么用数学计算 

我们可以模拟竖式的运算

 for(int i = 1; i <= al;i++)
    {
        for(int j = 1; j <= bl;j++)
        {
            ans[i+j-1] += a[i] * b[j];
            ans[i+j] += ans[i+j-1] / 10;
            ans[i+j-1] %= 10;
        }
    }

这个是这代码的关键部分,也是一个模板 

如 13*14

那么双重循环先是13*4, 有循环一次就是13*10.

完整代码

#include <bits/stdc++.h>
using namespace std;
string a1, b1;
int a[2005], b[2005], ans[4025], al, bl, an1;
void tim()
{
    reverse(a + 1, a + 1 + al);
    reverse(b + 1, b + 1 + bl);
    an1 = al + bl;
    for(int i = 1; i <= al;i++)
    {
        for(int j = 1; j <= bl;j++)
        {
            ans[i+j-1] += a[i] * b[j];
            ans[i+j] += ans[i+j-1] / 10;
            ans[i+j-1] %= 10;
        }
    }
    while(!ans[an1])
        an1--;
    reverse(ans + 1, ans + 1 + an1);
    return ;
}
int main()
{
    cin >> a1 >> b1;
    if(a1 == "0" || b1 == "0")
    {
        cout << 0;
        return 0;
    }
    al = a1.size();
    bl = b1.size();
    for(int i = 1; i <= al; i++)
        a[i] = a1[i-1] - '0';
    for(int i = 1; i <= bl; i++)
        b[i] = b1[i-1] - '0';
    tim();
    for(int i = 1; i <= an1; i++)
        cout << ans[i];
    return 0;
}

 

posted @ 2025-08-27 13:51  鑫鑫志邦  阅读(14)  评论(0)    收藏  举报