高精度乘法

主代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    char al[101],bl[101];
    int a[101],b[101],c[10001],lena,lenb,lenc,i,j,x;//所有需要的东西
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));//这三行为清零操作(memset)
    scanf("%s",al);//输入第一个乘数
    scanf("%s",bl);//第二个
    lena=strlen(al);
    lenb=strlen(bl);//计算两个乘数的位数
    for(i=0;i<=lena-1;i++)a[lena-i]=al[i]-48;//利用ascll码性质,0的ascll码为48.减去零就是ascll减去48,成功将字符转化为数字
    for(i=0;i<=lenb-1;i++)b[lenb-i]=bl[i]-48;//同上
    for(i=1;i<=lena;i++)//根据乘法竖式原理:12——第一行,对应外层for
              //        * 12——第二行,对应内层for
              //        _____
              //          4
              //         2
              //         2
              //         1
  `           //        _____
              //         144 { x
=0; for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[j]+x+c[i+j-1];//核心算法,两个数每一位分别相乘再加上x(上一位的进位) x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x;//确定进位 } lenc=lena+lenb; while(c[lenc]==0&&lenc>1)//如果最高为上为零,lenc减一,消去 lenc--; for(i=lenc;i>=1;i--)//此for用来一位一位倒序输出 cout<<c[i]; cout<<endl; return 0; }

更精简明了的高精模板:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define re register
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
char k[2003];
int lena,lenb,lenc,a[2003],b[2003],c[4019];
int main()
{
    cin>>k;
    lena=strlen(k);
    for(int i=1;i<=lena;i++)
        a[i]=k[lena-i]-'0';
    memset(k,0,sizeof(k));
    cin>>k;
    lenb=strlen(k);
    for(int i=1;i<=lenb;i++)
        b[i]=k[lenb-i]-'0';
    for(int i=1;i<=lena;i++)
        for(int j=1;j<=lenb;j++)
        {
            c[i+j-1]+=a[i]*b[j];
        } 
    for(int i=1;i<=lena+lenb;i++)
    {
        if(c[i]>9)
        {
            c[i+1]+=c[i]/10;c[i]%=10;
        }
    }
    lenc=lena+lenb;
    while(c[lenc]==0&&lenc>1)lenc--;
    for(int i=lenc;i>=1;i--)
        printf("%d",c[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/lbssxz/p/10464379.html