精度计算-大数乘大数

精度计算                     大数乘大数

本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数)
算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组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语言实现过程。

点赞