
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);