要求
/**
给定两个字符串形式的整数 num1 和 num2 ,计算它们的和、差。
提示:
num1 和num2 的长度都小于 5100
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式
*/
整体思路:将字符串拆分存储到数组中,然后进行操作。
相加
/**
思路:将字符串拆分存储到数组中,末尾对齐,数组元素两两相加,同时记录对应该次的相加的结果有没有进位,如果有进位下一次相加时要加1
*/
function addStringNumber(str1, str2) {
// 将字符串转换为数组
const arr1 = str1.split(""), arr2 = str2.split("");
let result = "";
let len1 = arr1.length - 1, len2 = arr2.length - 1;
let flag = 0;
while(len1 >= 0 || len2 >= 0) {
let temp = Number(arr1[len1]) + Number(arr2[len2]) + flag;
if(len1 < 0) {
temp = Number(arr2[len2]) + flag;
len1 = 0;
}
if(len2 < 0) {
temp = Number(arr1[len1]) + flag;
len2 = 0;
}
// 相加结果是否有进位
flag = temp >= 10 ? 1 : 0;
// 相加结果大于0,当前结果就只保留个位数
result = (temp % 10) + result;
len1--;
len2--;
}
return flag > 0 ? `${flag}${result}` : `${result}`;
}
addStringNumber("1034027789", "9999999999999"); // 结果:'10001034027788'
addStringNumber("9", "9999999999999"); // 结果:'10000000000008'
相减
function subtractStringNumber(str1, str2) {
// 将字符串转成数组
let arr1 = str1.split(""), arr2 = str2.split("");
// 标记被减数是否大于减数
let flag = arr1.length > arr2.length;
// 被减数和减数长度一样,依次判断是否有被减数小于减数的情况
if(arr1.length == arr2.length) {
for(let i=0, len=arr1.length; i<len; i++) {
if(arr1[i] == arr2[i]) {
continue;
}
flag = arr1[i] > arr1[i];
break;
}
}
// 只要被减数小于减数,就互相交换
if(!flag) {
arr1 = [arr2, arr2 = arr1][0];
}
let res = "";
while(arr1.length) {
// 从最后一位开始相减,计算结果
let temp = parseInt(arr1.pop()) - parseInt(arr2.pop() || 0);
if(temp >= 0) {
res = temp + res;
} else {
res = temp + 10 + res;
arr1[arr1.length-1]--;
}
}
// 去掉前面无效的0
let result = (flag ? '' : '-') + res.replace(/^0*/g, '');
if(result === '-') {
result = '0';
}
return result;
}
subtractStringNumber("100000000000000000","8"); // 结果:'99999999999999992'
subtractStringNumber('9999999992', '100000000000000000'); // 结果:'-99999990000000008'
相乘
function multiplyStringNumber(str1, str2) {
if(str1 === '0' || str2 === '0') {
return '0';
}
let result = [], last1 = null, last2 = null, mul = null;
for(let i=0; i<str1.length; i++) {
// 取str1中的最后一个数字
last1 = str1[str1.length - 1 - i];
for(let j=0; j<str2.length; j++) {
// 取str2中的最后一个数字
last2 = str2[str2.length - 1 - j];
// mul表示str1和str2分别2位相乘的结果
mul= result[i + j] ? result[i + j] + last1 * last2 : last1 * last2;
result[i + j] = mul % 10;
if(mul >= 10){
result[i + j + 1] = result[i + j +1] ?
result[ i + j + 1] + Math.floor(mul / 10) :
Math.floor(mul / 10);
}
}
}
return result.reverse().join('');
}
multiplyStringNumber('2', '23456'); // 结果:'46912'