高精度的模拟题(大数相乘)

题目链接
(手动点击跳转)


题目分析:同样是高精度模拟的题

#include <iostream>
#include <cstring>
using namespace std;
#define maxn 5020
int a[maxn],b[maxn],c[maxn];

int main()
{
    string A,B;
    cin >> A >> B;
    int lena = A.length(),lenb = B.length();
    for(int i=lena-1,j=1;i>=0;i--,j++){
        a[j] = A[i]-'0';
    }
    for(int i=lenb-1,j=1;i>=0;i--,j++){
        b[j] = B[i] - '0';
    }
    for(int i=1;i<=lena;i++){
        for(int j=1;j<=lenb;j++){
            c[i+j-1] += a[i]*b[j];  //i位和j位数值的贡献值,通过规律发现会累计到i+j-1位上去
        }
    }
    for(int i=1;i<=lena+lenb;i++){
        c[i+1] += c[i]/10; //模拟进行进位处理
        c[i] %=10;
    }
    int len = lena +lenb; //两数乘积之和的位数小于等于两数位数之和
    while(!c[len]){ //通过循环去除前导 0
        len--;
    }
    for(int i=max(1,len);i>0;i--){ //max(1,len)为了避免0乘以一个数,没有输出的特殊情况,保证至少有一个数输出
        cout << c[i];
    }
    return 0;
}
posted @ 2022-03-12 11:27  TCcjx  阅读(43)  评论(0编辑  收藏  举报