/*列表法——高精度乘法*/
#include<stdio.h>
#include<string.h>
#define maxsize 101
void compute(char *a,char *b,char *c){
int i,j,carry,sum,m=strlen(a)-1,n=strlen(b)-1;
for(i=0;i<=m;i++)a[i]-='0';
for(j=0;j<=n;j++)b[j]-='0'; //字符数字化
c[m+n+2]='\0'; //字符串标志位
carry=0; //初始化进位
for(i=m+n;i>=0;i--){ //结果控制位 ,a上,b下,纵向模拟
sum=carry; //把上一层进位加入
if((j=i-m)<0)j=0; //防止到M位之后,B的位序为负
for(;j<=i&&j<=n;j++)
sum+=a[i-j]*b[j]; //关键步骤,位数和要等于当前位数,即i=i-j+j
c[i+1]=sum%10+'0'; //字符化结果
carry=sum/10; //进位
}
if((c[0]=carry+'0')=='0')c[0]='#';//最高位只可能是进位来的
}
void display(char *c){
int j=strlen(c),i=0;
if(c[0]=='#')i++; //判断最高位是否进位
for(;i<j;i++)printf("%c",c[i]);
printf("\n");
}
int main(){
char a[maxsize],b[maxsize],c[2*maxsize]; //相乘位数考虑
while(scanf("%s",a)!=EOF&&scanf("%s",b)!=EOF){
compute(a,b,c);
display(c);
}
}
高精度乘法———列表法
最新推荐文章于 2021-11-13 21:41:50 发布