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