大整数乘法-----------分治

前几天看到了大整数加法的算法,觉得十分有趣,遂决定自己写一个大证书乘法,代码如下!

#include <stdio.h>
#include <string.h>
#define size 200

void mod(int sum[],int i)            //进位
{
    if(sum[i]>=10)
    {
        sum[i+1]+=(sum[i]/10);
        sum[i]%=10;
    }
}

void mod_2(int (*s)[420],int i,int j)             //作用等同于上面的函数的作用,可舍弃
{
    if(s[i][j]>=10)
    {
        (s[i][j+1])+=(s[i][j]/10);
        s[i][j]%=10;
        mod_2(s,i,j+1);
    }
}

int main()
{
    int a[size+10],b[size+10];
    int s[size+10][2*size+20],sum[2*size+20];
    char c[size+10],d[size+10];
    int i,j=0,k,flag=0,temp=0;
    int length1,length2;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(sum,0,sizeof(sum));
    memset(s,0,sizeof(s));

    printf("请输入整数a:");
    scanf("%s",c);
    printf("请输入整数b:");
    scanf("%s",d);
    length1=strlen(c);
    length2=strlen(d);
    for(i=length1-1;i>=0;i--)
        a[j++]=c[i]-'0';
    j=0;
    for(i=length2-1;i>=0;i--)
        b[j++]=d[i]-'0';
    for(i=0;i<size+10;i++)
    {
        k=temp;
        for(j=0;j<size+10;j++)
        {
            s[i][k++]=s[i][k-1]+a[i]*b[j];                               //产生的进位不能忽略
            mod_2(s,i,k-1);
        }

        temp++;
    }
    for(i=0;i<size+10;i++)
    {
        flag=0;
        for(j=2*size+20-1;j>=0;j--)
        {
            if(flag)
                printf("%d",s[i][j]);
            else
                if(s[i][j])
                {
                    printf("%d",s[i][j]);
                    flag=1;
                }
        }
        if(flag)
            printf("\n");
    }
    for(i=0;i<2*size+10;i++)
    {
        for(j=0;j<size+10;j++)
        {
            sum[i]+=s[j][i];
            if(sum[i]>=10)
                mod(sum,i);
        }
    }
    printf("两个大整数的积为:\n");

    printf("\n\n");
    flag=0;
    for(i=2*size+20-1;i>=0;i--)                    //控制打印的结果,去除先导0
    {
        if(flag)
            printf("%d",sum[i]);
        else
            if(sum[i])
            {
                printf("%d",sum[i]);
                flag=1;
            }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40552964/article/details/82633057