以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
127. BigDecimal 减法
解题思路:
- 首先把被减数和减数分开为整数部分和小数部分;
- 如果有小数部分,那么需要在小数部分后面补零,使得被减数和减数的小数部分位数相等,便于后面相减;
- 在整数部分和小数部分分别相减,需要借位的话从高位向低位进行借位,然后从低位向高位进行相减;
- 最后,把整数部分和小数部分相加得到最终的结果;
- 最终结果的结尾的0需要去掉。
具体实现见下方代码:
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
function subtract(num1, num2) {
// 将 num1 和 num2 分离为整数部分和小数部分
let [int1, dec1 = ''] = num1.split('.');
let [int2, dec2 = ''] = num2.split('.');
// 补齐小数部分的位数
while (dec1.length < dec2.length) dec1 += '0';
while (dec2.length < dec1.length) dec2 += '0';
// 分别计算整数部分和小数部分的结果
let intResult = subtractHelper(int1, int2);
let decResult = subtractHelper(dec1, dec2);
// 处理借位
let result = '';
let borrow = 0; // 借位标志位
let len = decResult.length;
for (let i = len - 1; i >= 0; i--) {
let x = decResult[i] - borrow;
let y = i >= len - dec1.length ? dec1[i - (len - dec1.length)] : '0';
if (x < y) {
borrow = 1;
result = String(x + 10 - y) + result;
} else {
borrow = 0;
result = String(x - y) + result;
}
}
// 处理整数部分
intResult = subtractHelper(intResult, borrow);
// 拼接整数部分与小数部分,去掉前导0
result = intResult + (result ? '.' + result.replace(/0+$/, '') : '');
// 处理负号
if (result.charAt(0) === '.') result = '0' + result;
if (int1.charAt(0) === '-' && int2.charAt(0) !== '-') result = '-' + result;
return result;
}
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
function subtractHelper(num1, num2) {
let sign = '';
if (num1.charAt(0) === '-' && num2.charAt(0) !== '-') {
return add(num1.substr(1), num2);
}
if (num1.charAt(0) !== '-' && num2.charAt(0) === '-') {
return add(num1, num2.substr(1));
}
if (num1.charAt(0) === '-' && num2.charAt(0) === '-') {
sign = '-';
num1 = num1.substr(1);
num2 = num2.substr(1);
}
if (num1.length < num2.length || (num1.length === num2.length && num1 < num2)) {
sign = '-';
let temp = num1;
num1 = num2;
num2 = temp;
}
let result = '';
let len1 = num1.length;
let len2 = num2.length;
let diff = len1 - len2;
let borrow = 0; // 借位标志位
for (let i = len2 - 1; i >= 0; i--) {
let x = num1[i + diff] - borrow;
let y = num2[i];
if (x < y) {
borrow = 1;
result = String(x + 10 - y) + result;
} else {
borrow = 0;
result = String(x - y) + result;
}
}
for (let i = diff - 1; i >= 0; i--) {
let x = num1[i] - borrow;
if (x < 0) {
borrow = 1;
result = String(x + 10) + result;
} else {
borrow = 0;
result = String(x) + result;
}
}
return sign + (borrow ? '1' : '') + result.replace(/^0+/, '') || '0';
}
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
function add(num1, num2) {
let sign = '';
if (num1.charAt(0) === '-' && num2.charAt(0) === '-') {
num1 = num1.substr(1);
num2 = num2.substr(1);
sign = '-';
} else if (num1.charAt(0) === '-') {
return subtract(num2, num1.substr(1));
} else if (num2.charAt(0) === '-') {
return subtract(num1, num2.substr(1));
}
let result = '';
let len1 = num1.length;
let len2 = num2.length;
let carry = 0;
for (let i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0 || carry; i--, j--) {
let x = +num1[i] || 0;
let y = +num2[j] || 0;
let sum = x + y + carry;
if (sum >= 10) {
carry = 1;
result = String(sum - 10) + result;
} else {
carry = 0;
result = String(sum) + result;
}
}
return sign + result;
}