以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
76. 实现BigInt的加法(含符号)
实际上,可以将数字字符串转换为数组,再用数组模拟加法,最后再将数组转换回字符串。具体实现步骤如下:
对于负数的处理,可以在转换为数组时单独处理符号位,并在结果中加上负号。
数组模拟加法的步骤与正常加法一样,从末位开始往前加,记录下进位,最后再将结果数组转换为字符串。
对于字符串中可能出现前导0的情况,需要在结果中去掉这些前导0。
代码实现如下:
function add(a, b) {
// 将数字字符串转换为数组
const arrA = a.split('').map(Number);
const arrB = b.split('').map(Number);
// 处理符号位
const signA = arrA[0] === '-';
const signB = arrB[0] === '-';
if (signA) arrA.shift();
if (signB) arrB.shift();
const length = Math.max(arrA.length, arrB.length);
// 补零对齐
while (arrA.length < length) {
arrA.unshift(0);
}
while (arrB.length < length) {
arrB.unshift(0);
}
let carry = 0; // 进位
const result = [];
// 从末位开始加
for (let i = length - 1; i >= 0; i--) {
let sum = arrA[i] + arrB[i] + carry;
if (sum >= 10) {
carry = 1;
sum -= 10;
} else {
carry = 0;
}
result.unshift(sum);
}
// 加上最后一次的进位
if (carry) {
result.unshift(carry);
}
// 处理符号位并将数组转换为字符串
let resultStr = result.join('');
if (signA && signB) {
resultStr = '-' + resultStr;
} else if (signA) {
resultStr = sub(b, a.slice(1));
} else if (signB) {
resultStr = sub(a, b.slice(1));
}
return resultStr;
}
// 实现减法
function sub(a, b) {
if (a === b) {
return '0';
}
const arrA = a.split('').map(Number);
const arrB = b.split('').map(Number);
const signA = arrA[0] === '-';
const signB = arrB[0] === '-';
if (signA) arrA.shift();
if (signB) arrB.shift();
const length = Math.max(arrA.length, arrB.length);
// 补零对齐
while (arrA.length < length) {
arrA.unshift(0);
}
while (arrB.length < length) {
arrB.unshift(0);
}
let borrow = 0; // 借位
const result = [];
// 从末位开始减
for (let i = length - 1; i >= 0; i--) {
let diff = arrA[i] - arrB[i] - borrow;
if (diff < 0) {
borrow = 1;
diff += 10;
} else {
borrow = 0;
}
result.unshift(diff);
}
// 去掉前导0
while (result.length > 1 && result[0] === 0) {
result.shift();
}
// 处理符号位并将数组转换为字符串
let resultStr = result.join('');
if (signA && signB) {
resultStr = sub(b, a.slice(1));
} else if (signA) {
resultStr = '-' + resultStr;
}
return resultStr;
}
需要注意的是,在代码中调用了一个子函数sub
来实现减法,这是因为在加法的实现中需要用到减法,而减法的实现也比较复杂,单独写一个函数可以使代码更清晰。