两个大数相乘

问题:两个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