为了进行高精度计算,我们可以用一个数组表示一个正整数,一个数组元素表示整数的一位,例如396可以用数组A表示,即A[1]=6,A[2]=9,A[3]=3,编一个函数,计算这样表示的两个整数A,B之积,积存放在数组C中。注:假定积不会超过100位。
解题思路:
模拟手算乘法。(捋思路很费时间。。。)
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int a[100];//被乘数
int b[100];//乘数
int c[100]; //结果
int n,m;
while(~scanf("%d%d",&m,&n))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int l1=0,l2=0;
while(m!=0)//分离各位存起来
{
a[l1++]=m%10;
m=m/10;
}
printf("l1===%d\n",l1);
for(int i=0;i<l1;i++)
{
printf("%d ",a[i]);
}
printf("\n");
while(n!=0)//分离各位存起来
{
b[l2++]=n%10;
n=n/10;
}
printf("l2===%d\n",l2);
for(int i=0;i<l2;i++)
{
printf("%d ",b[i]);
}
printf("\n");
for(int i=0;i<l1;i++)//逐位相乘
{
for(int j=0;j<l2;j++)
{
c[i+j]+=a[i]*b[j];
printf("c[%d]===c[%d+%d]===a[%d]*b[%d]===%d*%d===%d\n",i+j,i,j,i,j,a[i],b[j],c[i+j]);
}
}
for(int i=0;i<l1+l2;i++)//对超过10的位进行进位
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;//进位
c[i]=c[i]%10;//进位后剩余
}
}
int k=l1+l2;//两数相乘最大不超过两数位数和
while(c[k]==0)//去除多余0位
{
k--;
}
while(k!=-1)//输出结果
{
printf("%d",c[k--]);
}
printf("\n");
}
return 0;
}