[高精度]高精乘法

#include
#include<string.h>
int d,a[10000],b[10000];
char s[10000],ss[10000],c[100000];
int work()
{
    int len=strlen(s);
    for(int i=0;i<len;i++)
        a[len-1-i]=s[i]-'0';
    int jw=0;
    for(int i=0;i<len;i++)
    {
        a[i]=a[i]*d+jw;
        jw=a[i]/10;
        a[i]%=10;
    }
    if(jw!=0)
    {
        a[len]=jw;
    }
    while(a[len]>=10)
    {
        a[len+1]=a[len]/10;
        a[len]%=10;
        len++;
    }
    while(a[len-1]==0 && len>1)
        len--;
    for(int i=len;i>=0;i--)
        printf("%d",a[i]);
}
int workb()
{
    memset(c,0,sizeof(c));

    int len=strlen(s);
    for(int i=0;i<len;i++)
        a[len-1-i]=s[i]-'0';

    int lenn=strlen(ss);
    for(int i=0;i<len;i++)
        b[lenn-1-i]=ss[i]-'0';

    for(int i=0;i<len;i++)
        for(int j=0;jint l=len+lenn-1;
    for(int i=0;i1]+=c[i]/10;
        c[i]%=10;
    }

    if(c[l]>0) l++;
    while(c[l-1]>=10)
    {
        c[l]=c[l-1]/10;
        c[l-1]%=10;
        l++;
    }

    while(c[l-1]==0 && l>1)
        l--;
    for(int i=l-1;i>=0;i--)
        printf("%d",c[i]);
}
int main()
{
    while(scanf("%s%s",s,ss))
    {
        workb();
    }
}

分段解读:
work:高精*低精
第一段:把字符串转换为整形数组(为了方便运算,倒序写入)重置进位

int len=strlen(s);
    for(int i=0;i<len;i++)
        a[len-1-i]=s[i]-'0';
    int jw=0;

第二段:把每一位与d(低精整数)相乘.如果大于10则进位

for(int i=0;ii++)
    {
        a[i]=a[i]*d+jw;
        jw=a[i]/10;
        a[i]%=10;
    }

第三段:处理头位进位问题,while去0;
注意:去0不能全部去掉

if(jw!=0)
    {
        a[len]=jw;
    }
    while(a[len]>=10)
    {
        a[len+1]=a[len]/10;
        a[len]%=10;
        len++;
    }
    while(a[len-1]==0 && len>1)
        len--;

输出.
workb:高精*高精
第一段:第一段:把字符串转换为整形数组(为了方便运算,倒序写入)重置临时数组

memset(c,0,sizeof(c));

    int len=strlen(s);
    for(int i=0;i1-i]=s[i]-'0';

    int lenn=strlen(ss);
    for(int i=0;i1-i]=ss[i]-'0';

第二段:把a[i]与b[ii]相乘,结果加到c[ii+i]

    for(int i=0;ii++)
        for(int j=0;jj++)
        {
            c[i+j]+=a[i]*b[j];
        }

第三段:处理进位,处理头位进位,while去0;

int l=len+lenn-1;
    for(int i=0;ii++)
    {
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }

    if(c[l]>0) l++;
    while(c[l-1]>=10)
    {
        c[l]=c[l-1]/10;
        c[l-1]%=10;
        l++;
    }

    while(c[l-1]==0 && l>1)
        l--;

输出.

你可能感兴趣的:([高精度]高精乘法)