下面这些内容是参考http://xmxoxo.blog.hexun.com/6984004_d.html
自己整理了一下:
12*34=?
乘数:12
被乘数:34
先把乘数列出来,第i行列左起第i位数,列N次(N为乘数的位数)
第二行起每次右移一位
(1) (1)
(2) (2)
写入被乘数,按先列后行的方式
(1,3) (1,4)
(2,3) (2,4)
将()内的数两乘
(1,3=3) (1,4=4)
(2,3=6) (2,4=8)
相加,注意进位
(1,4=8)
-------------------------
3 10 8
.
-------------------------
4 0 8
12*34=408
再看三位数乘法
123*456=?
第一步:
(1) (1) (1)
(2) (2) (2)
(3) (3) (3)
第二步:
(1,4) (1,5) (1,6)
(2,4) (2,5) (2,6)
(3,4) (3,5) (3,6)
第三步:
(1,4= 4) (1,5= 5) (1,6= 6)
(2,4= 8) (2,5=10) (2,6=12)
(3,4=12) (3,5=15) (3,6=18)
第四步:
(1,6=18)
----------------------------------------------
4 13 28 27 18
. . . .
----------------------------------------------
5 6 0 8 8
123*456=56088
分析一下每一位的值是如何计算出来的,以下说的位都是从个位算起:
结果的第i位,是乘数的第i位乘以被乘数的1位,再加上乘数的第i-1位乘
以被乘数的第2位,一起加到乘数的第1位乘以被乘数的第i位。这样描述起
来有点不明白,画个图就很清楚了:
123*456的第3位:从乘数的第3位(1)起到第1位(3),按从右向左的方式
逐个乘以被乘数:
1*6+2*5+3*4=28
再把进位加上就可以了。
到这里,已经可以得出一个通用的计算方法,把结果逐位计算出来。
通过上面的分析,我们知道了算法的核心思想,接下来就能把算法实现,实现方法如下:
#include "iostream" using namespace std; #define N 100 void char_to_int(int *a,char* ch){ int len = strlen(ch); int i = 0,term = 0; for(i = 0 ; i < N ; i++){ a[i] = 0; } for(i = 0 ; i < len ; i++){ term = ch[i]; a[len-i-1] = (term - '0'); } } int main() { int a[N],b[N],c[2*N]; char ch1[N],ch2[N]; int i = 0,j =0; cout<<"1:"; cin>>ch1; cout<<"2:"; cin>>ch2; scanf("s",&ch2); char_to_int(a,ch1); char_to_int(b,ch2); for(i = 0 ; i < 2*N ; ++i){ c[i] = 0; } for(i = 0 ; i < N ; ++i){ for(j = 0 ; j < N ; ++j){ c[i+j] += a[i] * b[j]; } } for(i = 0 ; i < 2*N -1 ; ++i){ c[i+1] += c[i] /10; c[i] = c[i] % 10; } j = 2*N -1; while(c[j] == 0) j--; for(i = j;i >= 0; --i) printf("%d",c[i]); printf("\n"); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。