算法需求
求两个整数相乘的算法
算法分析
将前一个数的每一位和后一个数的每一位相乘,因计算过程中涉及到满十进位的问题,所以可以通过判断相乘数的位数进行补零操作来简化这个问题,如下图所示:
例如计算:84 * 13
第一步计算4 * 13:
4 * 3 = 12(3在个位,不需要补零)
4 * 1 = 4 (1在十位,计算结果需要补1个零,即4*10)
结果:(4 * 1 * 10) + (4 * 3) = 52(4在个位,计算结果不需要补零)
第二步计算8 * 13:
8 * 3 = 24(3在个位,不需要补零)
8 * 1 = 8(1在十位,需要补1个零,即8*10)
结果:(8 * 1 * 10 + 8 * 3) * 10 = 1040(8在十位,计算结果需要补1个零)
最后一步:把上述几步结果值相加
结果:1040 + 52 = 1092
代码实现
// 乘法操作
public static long mutilply(String left, String right) {char[] leftAry = left.toCharArray();char[] rightAry = right.toCharArray();long num = 0;// 第二轮叠加所有的数for (int i = leftAry.length - 1; i >= 0; i--) {long total = 0;int startInt = leftAry[i] - '0';// 第一轮叠加所有的数for (int j = rightAry.length - 1; j >= 0; j--) {int result = 0;int endInt = rightAry[j] - '0';result = startInt * endInt;// 补零操作long buildNum = fillZero(rightAry.length - j - 1);total += result * buildNum;}long buildNum = fillZero(leftAry.length - i - 1);num += total * buildNum;}return num;
}// 补零操作
private static long fillZero(int n) {StringBuilder builder = new StringBuilder();builder.append("1");for (int i = 0; i < n; i++) {builder.append("0");}return Long.parseLong(builder.toString());
}
总结
本算法中使用的数据类型为long,故相乘的结果不能超过2^63-1,否则会出现精度丢失。如果需要更大的整数相乘(无限大),则建议使用数组解决该问题