一、先算125*3,3*5获得15个1,3*2获得6个10,3*1获得3个100;算法
二、接下来算125*5,5*5获得25个10,2*5获得10个100,5*1获得5个1000;编程
三、乘法过程完毕。接下来从 a[0]开始向高位逐位处理进位问题。a[0]留下5,把1 加到a[1]上,a[1]变为32 后,应留下2,把3 加到a[2]上……最终使得a里的每一个元素都是1 位数,结果就算出来了code
结果就是6625。blog
总结一个规律:即一个数的第i 位和另外一个数的第j 位相乘所得的数,必定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
即:ans[i+j] = a[i]*b[j];
字符串
另外进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;前导清零。
string
下面是C语言代码实现:io
#include<stdio.h> #include<string.h> #define MAX 100 char a[MAX],b[MAX];//用字符串进行数字的输入 int x[MAX+10],y[MAX+10],z[MAX*2+10];//积的位数最可能是因数位数的两倍 int main() { int len1,len2,i,j; while(~scanf("%s %s",a,b)) { len1=strlen(a); len2=strlen(b); for(j=0,i=len1-1;i>=0;i--)//将字符串中字符转化为数字,并倒序储存 x[j++]=a[i]-'0'; for(j=0,i=len2-1;i>=0;i--) y[j++]=b[i]-'0'; for(i=0;i<len1;i++)//将因数各个位上的数字与另外一个各个位上的数字相乘 { for(j=0;j<len2;j++) z[i+j]=z[i+j]+x[i]*y[j];//先乘起来,后面统一进行进位 } for(i=0;i<MAX*2;i++)//进行进位 { if(z[i]>=10) //若>=10 { z[i+1]=z[i+1]+z[i]/10; //将十位上数字进位 z[i]=z[i]%10; //将个位上的数字留下 } } for(i=MAX*2;i>0;i--) //删除0的前缀 { if(z[i]==0) continue; else break; } for(;i>=0;i--) //倒序输出 printf("%d",z[i]); printf("\n"); } return 0; }