返回
字符串形式存储大数实现大数相加、大数相乘
前端
2024-02-17 07:42:51
对于大数的计算,JavaScript 的数字类型可能无法满足,因为 JavaScript 的数字类型是双精度浮点数,大约有 17 位有效数字,超过这个范围后结果损失精度。因此,若要计算大数,可以使用字符串的方式来存储大数。
大数相加
使用字符串来存储大数时,字符串中的每一个字符可以代表数字,比如“12345”这个字符串可以表示数字 12345。为了进行大数相加,可以将两个大数分别存储在两个字符串中,然后从右往左依次相加每个字符所代表的数字,如果相加的结果大于 9,则进位到下一位,否则直接把结果放在下一位。
function bigIntegerAdd(str1, str2) {
// 将两个字符串反转
str1 = str1.split('').reverse().join('');
str2 = str2.split('').reverse().join('');
// 比较两个字符串的长度,并以较长的字符串为准
let maxLength = Math.max(str1.length, str2.length);
// 初始化结果字符串
let result = '';
// 进位标志
let carry = 0;
// 从右往左依次相加每个字符所代表的数字
for (let i = 0; i < maxLength; i++) {
// 获取两个字符串对应位置的字符
let num1 = parseInt(str1[i] || '0');
let num2 = parseInt(str2[i] || '0');
// 相加,并加上进位标志
let sum = num1 + num2 + carry;
// 如果相加结果大于 9,则进位到下一位,否则直接把结果放在下一位
if (sum >= 10) {
carry = 1;
result = (sum - 10) + result;
} else {
carry = 0;
result = sum + result;
}
}
// 如果最后还有进位,则加上进位标志
if (carry > 0) {
result = carry + result;
}
// 将结果字符串反转并返回
return result.split('').reverse().join('');
}
大数相乘
使用字符串来存储大数时,大数相乘与普通数字相乘类似,只不过需要考虑进位的问题。可以将两个大数分别存储在两个字符串中,然后从右往左依次相乘每个字符所代表的数字,如果相乘的结果大于 9,则进位到下一位,否则直接把结果放在下一位。
function bigIntegerMultiply(str1, str2) {
// 将两个字符串反转
str1 = str1.split('').reverse().join('');
str2 = str2.split('').reverse().join('');
// 比较两个字符串的长度,并以较长的字符串为准
let maxLength = Math.max(str1.length, str2.length);
// 初始化结果字符串
let result = '';
// 进位标志
let carry = 0;
// 从右往左依次相乘每个字符所代表的数字
for (let i = 0; i < maxLength; i++) {
// 获取两个字符串对应位置的字符
let num1 = parseInt(str1[i] || '0');
let num2 = parseInt(str2[i] || '0');
// 相乘,并加上进位标志
let product = num1 * num2 + carry;
// 如果相乘结果大于 9,则进位到下一位,否则直接把结果放在下一位
if (product >= 10) {
carry = Math.floor(product / 10);
result = (product % 10) + result;
} else {
carry = 0;
result = product + result;
}
}
// 如果最后还有进位,则加上进位标志
if (carry > 0) {
result = carry + result;
}
// 将结果字符串反转并返回
return result.split('').reverse().join('');
}
这种使用字符串的方式来存储和操作大数的方法虽然比较简单,但是效率不高,因为需要不断地进行字符串拼接和转换,尤其是当大数的位数非常多的时候,效率会非常低。在实际应用中,通常会使用更高效的算法和数据结构来进行大数的计算。