a:乘数
b:被乘数
s: 结果
#include<stdio.h> #include<string.h> void mult(char a[],char b[],char s[]); int main() { char a[]="0"; char b[]="10"; char s[65]; int i=0; mult(a,b,s); while(*(s+i)) { printf("%c",*(s+i)); i++; } return 0; } void mult(char a[],char b[],char s[]) { int i,j,alen,blen; int res[65][65]={0};//必须初始化为全零,下面是上三角形式的把位乘积相加 int k=0,sum=0,flag=0; char result[65]; alen=strlen(a);// 被乘数长度 blen=strlen(b);//乘数长度 //将a每位数与b每位数相乘 保存在res 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--)//计算res右下半个三角数的和 { for(j = blen-1; j >= 0; j--) sum=sum+res[i+blen-j-1][j];//sum存储着几个数的和 result[k]=sum%10; k++; sum/=10;//存储进位信息 } for(i=blen-2;i>=0;i--)//计算另一半的三角的和 { for(j=0;j<=i;j++) sum+=res[i-j][j]; result[k]=sum%10; k++; sum/=10; } if(sum) //最后一步有进位,要注意处理 { result[k]=sum; k++; } for(i=0;i<k;i++) result[i]+='0';//转换为字符acsii码 for(i=k-1;i>=0;i--) s[i]=result[k-i-1]; s[k]='\0';//方便以后处理,打印,哨兵的意思 while(1)//处理乘数或是被乘数是0,并让结果与a长度相同 { if(strlen(s)!=strlen(a)&& s[0]=='0') strcpy(s,s+1); else break; } }
by 吴尚奇 Devil_box 2014/06