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