课程29_17 1136 高精度乘法
题目:
题目描述:
给出两个长度小于100位的正整数,求其乘积。
输入描述:
两行,一行一个数。
输出描述:
一行,为所求乘积。
样例输入:
1937
2931
样例输出:
5677347
解析:
又是高精度。
其实高精度的加法减法和乘法都大同小异,都是通过模仿手算的方式去实现的。但是乘法的手算如果模拟起来会显得比较麻烦,所以我们要稍微加强一下。
我们唯一需要搞清楚的是,当某两个数字相乘以后,结果跑去了哪?
请看如下简陋图:
首先我们会先计算a乘上b的最后一个数的结果,我们发现,a2 x b1的结果我们写在了c3的位置,a1 x b1的结果我们写在了c2的位置……。于是我们大胆的猜测,是不是a(m) x b(n)的结果就应该写在c(m+n)的位置呢?
于是我们进一步验证:a2 x b0写在了c2、a0 x b0写在了c0。很明显这个规律应该是对的,那么我们就按照这个去做,把乘法的结果加在对应位置上(比如c2既有a2b0也有a1b1,那么c2=a2b0 + a1b1),然后如果计算过程中出现超过10的数字,就把他进位即可。
解题:
对于两个数字的乘法,我们发现每两个位置之间都必须要相乘一次。比如说上面举的例子中a有3位,b有2位,那么b0和a0~2都乘过,b1也是,一共乘了6次。所以我们只需要写一个双层的for循环就可以完成这个乘法了。
另外我们注意到:规律是c(m+n) += a(m)*b(n),那么m+n的范围就是0到2倍的m、n的范围,但是题目也说了答案不会超过200个数字,所以说明输入的两个不会超过100个数字,所以你会看到在for循环之中,我们的循环终止条件是ib<MAX_DIGIT/2,否则的话,会出现两个i相加大于MAX_DIGIT然后光荣越界的事故。
参考代码:
// TSOJ-1136 高精度乘法
#include <iostream>
#include <string>
using namespace std;
#