大数乘法思想跟大数加法类似,还是以字符串的形式输入,转化为整形数组的形式,再进行运算。
还是定义两个字符串数组,来保存输入的两个数,再定义三个整形数组,其中两个来保存被转化后的数,另一个来保存结果。
运算过程可以先把每一位先乘,乘完之后再加,并保存起来,最后在考虑进位问题。最后输出结果就行了。
下面是一个过程图:
两条虚线中间括号里的数都是每一步乘的结果,第二条虚线下面括号里面的数是把上面乘的结果相加之后的结果。最后一行是进位之后的最终结果。
下面是程序(多组测试的):
#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;
}