js 版本 超大数加减乘除 原运算

未结帖
0 665
ajian admin_jim 2018-03-17
悬赏:5飞吻
String.prototype.pad = function(str,len,type){
    if(typeof type == 'undefined'){
        type = "right";
    }
    var str_len = this.length;
    if(str_len >= len){
        return this;
    }else{
        var pad_str = Array.from({length:len - str_len}).fill("0",0).join('');
        if(type == 'right'){
            return this + pad_str;
        }else{
            return pad_str + this;
        }
    }
};
String.prototype.rtrim = function(str){
    var s = this.substr(-1);
    if(s == str){
        return this.substr(0,this.length - 1).rtrim(str);
    }else{
        return this;
    }
}
String.prototype.ltrim = function(str){
    var s = this.substr(0,1);
    if(s == str){
        return this.substr(1).ltrim(str);
    }else{
        return this;
    }
}
function big_number(number1,type="+",number2){
    var bl1 = number1.toString().indexOf('-') == -1;
    var bl2 = number2.toString().indexOf('-') == -1;
    if(type == '*' || type == '/'){
        if(bl1 ^ bl2){
            return "-" + big_number(number1,type,number2);
        }
    }else{
        if(type == "+"){
            if(bl1 && !bl2){
                return big_number(number1,"-",number2.toString().substr(1));
            }else if(!bl1 && bl2){
                return big_number(number2,"-",number1.toString().substr(1));
            }else if(!bl1 && !bl2){
                return "-" + big_number(number1.toString().substr(1),"+",number2.toString().substr(1));
            }
        }else if(type == '-'){
            if(bl1 && !bl2){
                return big_number(number1,"+",number2.toString().substr(1));
            }else if(!bl1 && bl2){
                return "-" + big_number(number2,"+",number1.toString().substr(1));
            }else if(!bl1 && !bl2){
                return big_number(number2.toString().substr(1),"-",number1.toString().substr(1));
            }
        }
    }
    var num1 = number1.toString();
    var num2 = number2.toString();
    if(type != '/'){
        num1 = num1.ltrim("0");
        num2 = num2.ltrim("0");
    }
    var len1 = num1.length;
    var len2 = num2.length;
    var len = Math.max(len1,len2);
    num1 = num1.pad("0",len,"left");
    num2 = num2.pad("0",len,"left");
    var arr1 = num1.split("");
    var arr2 = num2.split("");
    var arr = [];
    var mod = 0;
    var flg = true;
    if(type == '-'){
        for(var z = 0;z < arr1.length;z++){
            if(arr1[z] < arr2[z]){
                flg = false;
                break;
            }else if(arr1[z] > arr2[z]){
                flg = true;
                break;
            }
        }
    }
    var num = "";
    if(type == '+'){
        for(var i = len - 1;i >= 0;i--){
            num = parseInt(arr1[i]) + parseInt(arr2[i]) + mod;
            if(num >= 10){
                num -= 10;
                mod = 1;
            }else{
                mod = 0;
            }
            arr.unshift(num);
        }
        if(mod > 0){
            arr.unshift(mod);
        }
        num = arr.join('');
    }else if(type == '-'){
        for(var i = len - 1;i >= 0;i--){
            if(parseInt(arr2[i] + mod == 10)){
                num = parseInt(arr1[i]);
                mod = 1;
            }else{
                num = parseInt(arr1[i]) - parseInt(arr2[i]) - mod;
                if(num < 0){
                    mod = 1;
                    num = 10 + num;
                }else{
                    mod = 0;
                }
            }
            arr.unshift(Math.abs(num));
        }
        num = arr.join('');
    }else if(type == '*'){
        for(var i = len - 1;i >= 0;i--){
            var sub_arr = [];
            for(var j = len - 1;j >= 0;j--){
                num = parseInt(arr1[i]) * parseInt(arr2[j]) + mod;
                if(num >= 10){
                    mod = Math.floor(num / 10);
                    num = num % 10;
                }else{
                    mod = 0;
                }
                sub_arr.unshift(num);
            }
            if(mod != 0){
                sub_arr.unshift(mod);
            }
            var str = sub_arr.join("");
            str = str.pad("0",str.length + (len - 1 - i));
            arr.push(str);
            mod = 0;
        }
        var num = 0;
        while(arr.length > 0){
            var number = arr.pop();
            if(number.ltrim("0") > 0){
                num = big_number(num,"+",number.ltrim("0"));
            }
        }
    }else if(type = '/'){
        var diff_len = Math.abs(len1 - len2);
        var sub_len = len1 - diff_len;
        while(sub_len <= len1){
            var i = 0;
            var sub_num = num1.substr(0,sub_len);
            mod = arr.join("");
            while(true){
                var s = mod + (++i);
                var result = big_number(s,'*',num2);
                if(result.length > sub_num.length){
                    arr.push(i - 1);
                    break;
                }else{
                    if(result == sub_num){
                        arr.push(i);
                        break;
                    }else{
                        result = result.pad("0",sub_num.length,"left");
                        var result_arr1 = result.split("");
                        var result_arr2 = sub_num.split("");
                        var bl = false;
                        for(var k = 0;k < result_arr1.length;k++){
                            if(result_arr1[k] > result_arr2[k]){
                                arr.push(i - 1);
                                bl = true;
                                break;
                            }else if(result_arr1[k] < result_arr2[k]){
                                break;
                            }
                        }
                        if(bl){
                            break;
                        }
                    }
                }
            }
            sub_len++;
        }
        num = arr.join('');
    }
    num = num.ltrim("0");
    if(type == '-'){
        num = num.ltrim("0");
        if(!flg){
            num = "-" + num;
        }
    }
    return num;
}
var num1 = "35576056074804690";
var num2 = "-35432523532452345";
var num = big_number(num1,"+",num2);
console.log(num);


热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0