兩個大數相乘

問題:兩個100位以內的大數相乘

分析:模擬乘法累加法(雖然還有很多其他優秀算法,但是我認爲這種是比較好理解且代碼量不大的一種),用C語言實現的

參考:http://www.javashuo.com/article/p-wganfrjz-gk.html

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void mul(char *a,char *b)
{
    int alen,blen,len,i,j,cf;
    int *s;
    alen=strlen(a);
    blen=strlen(b);
    cf=0;   //進位標識
    s=(int*)malloc(sizeof(int)*(alen+blen));
    for(i=0; i<(alen+blen); i++)
    {
        s[i]=0;
    }
    for(i=alen-1; i>=0; i--)
    {
        for(j=blen-1; j>=0; j--)
        {
            s[(alen-1-i)+(blen-1-j)]=(a[i]-'0')*(b[j]-'0')+s[(alen-1-i)+(blen-1-j)];
        }
    }
    for(i=0; i<=(alen+blen-1); i++)
    {
        s[i]=s[i]+cf;
        if(s[i]>=10)
        {
            cf=s[i]/10;
            s[i]=s[i]%10;
        }
        else
        {
            s[i]=s[i];
            cf=0;
        }
    }
    len=0;   //高位可以不輸出的0儘量不輸出
    for(i=alen+blen-1;i>=0;i++)
    {
        if(s[i]==0)
        {
            len++;
        }
        else
        {
            break;
        }
    }

    len=alen+blen-1-len;
    for(i=len; i>=0; i--)
    {
        printf("%d",s[i]);
    }
    printf("\n");
}
int main()
{
    char n[101],m[101];
    while((scanf("%s %s",n,m))!=EOF)
    {
        mul(n,m);
    }
    return 0;
}


運行結果:

一小點想法:因爲兩個一位數相乘最大是81,然後如果有100位9與100位9相乘,那麼最大的數字應該不超過81+81+16+98=276,是在int類型的範圍類,所以保存結果的數組s定義成int類型應該是夠用的。

關於C語言裏的基本類型以及範圍,可以看這個博客:https://blog.csdn.net/qq_16234613/article/details/77541722