大数乘法

大数乘法思想跟大数加法类似,还是以字符串的形式输入,转化为整形数组的形式,再进行运算。

还是定义两个字符串数组,来保存输入的两个数,再定义三个整形数组,其中两个来保存被转化后的数,另一个来保存结果。

运算过程可以先把每一位先乘,乘完之后再加,并保存起来,最后在考虑进位问题。最后输出结果就行了。

下面是一个过程图:


两条虚线中间括号里的数都是每一步乘的结果,第二条虚线下面括号里面的数是把上面乘的结果相加之后的结果。最后一行是进位之后的最终结果。

下面是程序(多组测试的):

#include<stdio.h>

#include<string.h>

int main()

{

    int len1,len2,i,j,n;

    char a[1005],b[1005];

    intx[1005],y[1005],z[2200];

   scanf("%d",&n);

    while(n--)

    {

       memset(x,0,sizeof(x));   memset是一个清零函数还是把3个整形数组都清零,保证运算是有效的,如果没清零,会有随机数的干扰;

        memset(y,0,sizeof(y));

       memset(z,0,sizeof(z));

        scanf("%s%s",a,b);

        len1=strlen(a);

        len2=strlen(b);

        int sum=len1+len2;定义sum来表示最终结果的位数,相乘的两个数最终位数可能是输入的两个数的位数之和;

       for(j=0,i=len1-1;i>=0;i--)  转化类型;

            x[j++]=a[i]-'0';

       for(j=0,i=len2-1;i>=0;i--)  转化类型;

           y[j++]=b[i]-'0';

        for(i=0;i<1005;i++)

        {

           for(j=0;j<len2;j++)

               z[i+j]=z[i+j]+x[i]*y[j];先相乘,不需要进位;

        }

       for(i=0;i<sum;i++)

        {

           if(z[i]>=10)

            {

               z[i+1]=z[i+1]+z[i]/10;进位;

               z[i]=z[i]%10;

            }

        }

       for(i=sum;i>0;i--)从后往前找出第一个不为0的位置,也就是结果的最高位;

        {

            if(z[i]==0)

                continue;

            else

                break;

        }

        for(;i>=0;i--)   找出之后输出结果。

           printf("%d",z[i]);

       printf("\n");

    }

    return 0;

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值