高精度乘法———列表法

来源:互联网 发布:涂师傅数据恢复 编辑:程序博客网 时间:2024/05/19 03:25
/*列表法——高精度乘法*/ #include<stdio.h> #include<string.h>#define maxsize 101void 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);    }}