大整数乘法
2018-11-14 本文已影响0人
王剑_a9e1
模拟乘法累加 - 改进
例如:计算98×21,步骤如下
9 8
× 2 1
-------------
(9)(8) <---- 第1趟: 98×1的每一位结果
(18)(16) <---- 第2趟: 98×2的每一位结果
-------------
(18)(25)(8) <---- 这里就是相对位的和,还没有累加进位
这里唯一要注意的便是进位问题,我们可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑。从右向左依次累加,如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余后的个位数,而将十位数进位(通过模运算得到)累加到高位便可,循环直到累加完毕。
核心代码如下:
/**
* 大数相乘方法二
*/
public static int[] bigNumberMultiply2(int[] num1, int[] num2){
// 分配一个空间,用来存储运算的结果,num1长的数 * num2长的数,结果不会超过num1+num2长
int[] result = new int[num1.length + num2.length];
// 先不考虑进位问题,根据竖式的乘法运算,num1的第i位与num2的第j位相乘,结果应该存放在结果的第i+j位上
for (int i = 0; i < num1.length; i++){
for (int j = 0; j < num2.length; j++){
result[i + j + 1] += num1[i] * num2[j]; // (因为进位的问题,最终放置到第i+j+1位)
}
}
//单独处理进位
for(int k = result.length-1; k > 0; k--){
if(result[k] > 10){
result[k - 1] += result[k] / 10;
result[k] %= 10;
}
}
return result;
}