大数相加
在 JavaScript 中,当处理超过安全整数范围的大数字时,内置的Number
类型可能无法提供足够的精度。这时,我们需要一种方法来实现大数的相加操作。本文将介绍一种基于字符串处理的解决方案,并通过代码示例进行说明。
实现方法
以下是一个实现大数相加的函数:
function bigNumberAddition(firstNumber, secondNumber) {
let carryOver = 0; // 初始化进位
let sumArray = [];
// 使两个数字字符串长度相同
const maxLength = Math.max(firstNumber.length, secondNumber.length);
firstNumber = firstNumber.padStart(maxLength, '0');
secondNumber = secondNumber.padStart(maxLength, '0');
// 从低位到高位进行相加
for (let i = maxLength - 1; i >= 0; i--) {
let digitSum = parseInt(firstNumber[i], 10) + parseInt(secondNumber[i], 10) + carryOver;
sumArray.unshift(digitSum % 10); // 当前位的结果
carryOver = Math.floor(digitSum / 10); // 更新进位
}
// 如果最后仍有进位,添加到结果前面
if (carryOver) {
sumArray.unshift(carryOver);
}
return sumArray.join('');
}
// 测试
const numA = '12345678901234567890';
const numB = '98765432109876543210';
const sum = bigNumberAddition(numA, numB);
console.log(sum); // 输出 111111111011111111100
代码详解
初始化进位和结果数组
let carryOver = 0; // 初始化进位
let sumArray = [];
carryOver
用于存储每一位相加后的进位值。sumArray
用于存储每一位相加的结果。
确保两个数字字符串长度相同
const maxLength = Math.max(firstNumber.length, secondNumber.length);
firstNumber = firstNumber.padStart(maxLength, '0');
secondNumber = secondNumber.padStart(maxLength, '0');
- 通过
Math.max
找到两个数字字符串中较长的长度。 - 使用
padStart
方法在较短的字符串前补充'0'
,使两个字符串长度相同,便于逐位相加。
从低位到高位进行相加
for (let i = maxLength - 1; i >= 0; i--) {
let digitSum = parseInt(firstNumber[i], 10) + parseInt(secondNumber[i], 10) + carryOver;
sumArray.unshift(digitSum % 10); // 当前位的结果
carryOver = Math.floor(digitSum / 10); // 更新进位
}
- 使用
for
循环从字符串的最后一位(低位)开始,逐位相加。 parseInt
将字符转换为整数进行相加。digitSum % 10
得到当前位的结果,并将其添加到sumArray
的前面。Math.floor(digitSum / 10)
计算进位值,供下一位使用。
处理最后的进位
if (carryOver) {
sumArray.unshift(carryOver);
}
- 如果最后仍有进位,将其添加到结果数组的最前面。
返回结果
return sumArray.join('');
- 使用
join
方法将结果数组转换为字符串形式的大数相加结果。
测试示例
const numA = '12345678901234567890';
const numB = '98765432109876543210';
const sum = bigNumberAddition(numA, numB);
console.log(sum); // 输出 111111111011111111100
- 此测试示例展示了两个长度相同的大数相加的结果。
- 输出结果为
111111111011111111100
,验证了函数的正确性。
最佳实践
-
输入验证:在实际应用中,应对输入进行验证,确保输入的字符串仅包含数字字符。
function isValidNumber(str) {
return /^\d+$/.test(str);
}
if (!isValidNumber(firstNumber) || !isValidNumber(secondNumber)) {
throw new Error('输入必须为数字字符串');
} -
处理负数:当前函数仅支持正数相加。要支持负数,需要扩展函数逻辑,处理符号位。
-
性能优化:对于非常长的数字,可以考虑使用更高效的数据结构或算法来优化性能。