JS string numbers implement addition, subtraction and multiplication operations

Require

/**
      给定两个字符串形式的整数 num1 和 num2 ,计算它们的和、差。
      提示:
      num1 和num2 的长度都小于 5100
      num1 和num2 都只包含数字 0-9
      num1 和num2 都不包含任何前导零
      你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式
*/

The overall idea : split the string and store it in an array, and then perform operations.

Add

/**
思路:将字符串拆分存储到数组中,末尾对齐,数组元素两两相加,同时记录对应该次的相加的结果有没有进位,如果有进位下一次相加时要加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'

Subtract

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'

Multiply

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'

おすすめ

転載: blog.csdn.net/ganyingxie123456/article/details/113592517