精度计算 大数乘大数
本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数)。
算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中。例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s[1] = res[0][1]+res[1][0] = 4,s[2] = res[1][1] = 4,但是此时输出的话,结果是441,我们需要用for循环将结果逆置。更多位数的计算在过程上会更麻烦但远离上是一样的。
#include<stdio.h>
#include<string.h>
void mult(char a[],char b[],char s[]);
main()
{
char a[65] = "12";
char b[65] = "12";
char s[130] = "";
mult(a,b,s);
printf("%s",s);
}
void mult(char a[],char b[],char s[])
{
int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
char result[65];
alen=strlen(a);
blen=strlen(b);
for (i=0;i<alen;i++)
{
for (j=0;j<blen;j++)
{
res[i][j]=(a[i]-'0')*(b[j]-'0');
}
}
for (i=alen-1;i>=0;i--)
{
for (j=blen-1;j>=0;j--)
{
sum=sum+res[i+blen-j-1][j];
}
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
for (i=blen-2;i>=0;i--)
{
for (j=0;j<=i;j++)
{
sum=sum+res[i-j][j];
}
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
if (sum!=0)
{
result[k]=sum;
k=k+1;
}
for (i=0;i<k;i++)
{
result[i]+='0';
}
for (i=k-1;i>=0;i--)
{
s[i]=result[k-1-i];
}
s[k]='\0';
while(1)
{
if (strlen(s)!=strlen(a)&&s[0]=='0')
strcpy(s,s+1);
else
break;
}
}
下面是我的C语言实现过程。