以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
128. BigDecimal 乘法
解题思路:
乘法的实现可以使用竖式相乘的方法,即先计算出每一位的乘积,然后将它们相加,需要注意进位的问题。具体实现如下:
- 先判断乘数的符号,如果两个乘数符号相同,则结果为正,否则结果为负。
- 将两个乘数转化为绝对值,并将其倒置,方便从低位到高位进行计算。同时记录下两个绝对值的长度。
- 遍历第一个乘数的每一位,将它依次与第二个乘数的每一位相乘,得到该位的乘积以及进位。
- 将每个位的乘积以及进位按照位置加起来,得到相应的结果以及下一位需要进位的值。
- 最终得到相应的结果时,需要对结果去除最高位的0,并根据步骤1中的符号来决定结果的正负。
具体实现如下:
function multiply(a, b) {
// 判断乘数符号,记录结果符号
const sign = (a[0] === '-' ? (b[0] === '-' ? 1 : -1) : (b[0] === '-' ? -1 : 1));
// 取出两个乘数的绝对值
const absA = a.replace('-', '');
const absB = b.replace('-', '');
// 将绝对值倒置
const reverseA = [...absA].reverse();
const reverseB = [...absB].reverse();
// 初始化结果为0
const result = Array.from({ length: reverseA.length + reverseB.length }).fill(0);
// 遍历乘数a的每一位
for (let i = 0; i < reverseA.length; i++) {
const numA = Number(reverseA[i]);
let carry = 0;
// 遍历乘数b的每一位
for (let j = 0; j < reverseB.length; j++) {
const numB = Number(reverseB[j]);
// 计算该位的乘积以及进位
const product = numA * numB + carry + result[i + j];
const num = product % 10;
carry = Math.floor(product / 10);
result[i + j] = num;
}
// 处理进位
if (carry) {
result[i + reverseB.length] += carry;
}
}
// 去除结果前面不必要的0
while (result.length > 1 && result[result.length - 1] === 0) {
result.pop();
}
// 根据符号来确定结果的正负
const finalSign = result.length === 1 && result[0] === 0 ? 1 : sign;
return (finalSign === 1 ? '' : '-') + result.reverse().join('');
}