[高精度]高精細乗算

9396 ワード

#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:高精*低精第1段:文字列を整形配列に変換(演算を容易にするために逆順序で書き込む)リセットキャリー
int len=strlen(s);
    for(int i=0;i<len;i++)
        a[len-1-i]=s[i]-'0';
    int jw=0;

第2段:各ビットを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:高精*高精第1段:第1段:文字列を整形配列に変換(演算を容易にするために逆順に書き込む)一時配列をリセット
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';

第2段:a[i]とb[ii]を乗算し、結果をc[ii+i]に加算する
    for(int i=0;ii++)
        for(int j=0;jj++)
        {
            c[i+j]+=a[i]*b[j];
        }

第3段:処理進位、処理ヘッド進位、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--;

出力