高精度乘法-C++模板-实现-详细

乘法

 貌似高精度乘法看起来很简单。。。

co模板 快捷路径

#include<cstdio>
using namespace std;
const int wei=100000;
int a[100][wei],bz[100],ad[100];
void read(int i)
{
    char ch=getchar();
    bz[i]=1,ad[i]=0;
    int b[wei];
    while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); }
    while (ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();}
    for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j];
}
void mul(int i,int j,int k)
{
    for (int l=1;l<=ad[i];++l)
    {
        for (int r=1;r<=ad[j];++r)
        {
            a[k][l+r-1]+=a[i][l]*a[j][r];
            a[k][l+r]+=a[k][l+r-1]/10;
            a[k][l+r-1]%=10;
        }
    }
    ad[k]=ad[i]*ad[j]+3;
    while (a[k][ad[k]]==0) --ad[k];
    bz[k]=bz[i]*bz[j]; 
    return;
}
int main()
{
    read(1);
    read(2);
    mul(1,2,3);
    if (bz[3]==-1) printf("-");
    for (int i=ad[3];i>0;--i)
        printf("%d",a[3][i]);
}
乘法

乘法主要采用模拟手动运算解决,枚举每一次相乘即可

注意一下乘之后的位数会不会爆就行了

 下面代码中附有具体操作:

#include<cstdio>
using namespace std;
const int wei=100000;        //数的位数,初始为10100000。
int a[100][wei],bz[100],ad[100];    //a为具体数字,bz为正负号,ad为位数
void read(int i)     //读入高精度数
{
    char ch=getchar();
    bz[i]=1,ad[i]=0;
    int b[wei];
    while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); }
    while (ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();}
    for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j];
}
void mul(int i,int j,int k)      //乘法,意为将编号i的数乘以编号j的数
{
    for (int l=1;l<=ad[i];++l)      //枚举i的每一位
    {
        for (int r=1;r<=ad[j];++r)      //枚举j
        {
            a[k][l+r-1]+=a[i][l]*a[j][r];      //即结果的(L+R-1)位要加上乘积(列个竖式看看就知道为什么了)
            a[k][l+r]+=a[k][l+r-1]/10;     //进位操作
            a[k][l+r-1]%=10;
        }
    }
    ad[k]=ad[i]*ad[j]+3;    //押位操作
    while (a[k][ad[k]]==0) --ad[k];    //精确一下位数
    bz[k]=bz[i]*bz[j];      //符号为两个数符号相乘
    return;
}
int main()   
{        //测试
    read(1);       //读入编号一的数
    read(2);       //读入编号二的数
    mul(1,2,3);    //相乘
    if (bz[3]==-1) printf("-");     //判断正负
    for (int i=ad[3];i>0;--i)       //输出
        printf("%d",a[3][i]);
}
乘法部分就这样结束了,有意见欢迎在评论区提出。
posted @ 2020-08-14 21:17  聚合风铃  阅读(202)  评论(0)    收藏  举报