Сложить два очень больших числа

144
31 января 2020, 11:50

//Сложность заключается в запоминании единицы при сложеннии и добавлении её на следующей итерации.

longNumber1 = '2'
longNumber2 = '149'
//сравниваются числа,и в то которое меньше по длинне добавляются нули
if (longNumber1.length > longNumber2.length) {
    var abs = longNumber1.length - longNumber2.length
        for (var i = 0; i < abs; i++) {
        longNumber2 = '0' + longNumber2
    }
} else {
    var abs = longNumber2.length - longNumber1.length
        for (var i = 0; i < abs; i++) {
        longNumber1 = '0' + longNumber1
    }
}
var str = '' //результат сложения двух чисел
var currentNum = '' //если в результате сложения число двузначное, то берем второе число и записываем на эту позицию
var nextPos = 0 //и запоминаем единицу в будущем
for (var i = longNumber1.length - 1; i >=0; i--) {
    if ( (Number(longNumber1[i])) + (Number(longNumber2[i])) < 10 ) { 
        str = Number(longNumber1[i]) + Number(longNumber2[i]) + str 
        nextPos = 0
    } else {
        str = Number(longNumber1[i]) + Number(longNumber2[i])
        str = String(str)
        currentNum = (str.slice(1,2)) //берем вторую цифру двузначного числа
        str = currentNum // записываем ее на эту позицию 
        nextPos = 1 //т.к число двузначное то мы должны прибавить единицу к след.цифре
    }    
}   
console.log(longNumber1)
console.log(longNumber2)
console.log(str)
Answer 1

По ходу исполнения кода Вы затираете значение str. Вам нужно было выбрать другое название переменной для str в блоке else.

И всегда используйте ; в JavaScript!

Я сделал минимально необходимые правки в стиле, в котором написан весь код. Но, должен заметить, что стиль пока очень хромает. Всё можно сделать гораздо более оптимально. Ну ничего, научитесь - со временем сделаете.

longNumber1 = '999'; 
longNumber2 = '149'; 
 
//сравниваются числа, и в то, которое меньше по длине, добавляются нули 
 
if (longNumber1.length > longNumber2.length) { 
  var abs = longNumber1.length - longNumber2.length; 
  for (var i = 0; i < abs; i++) { 
    longNumber2 = '0' + longNumber2; 
  } 
} else { 
  var abs = longNumber2.length - longNumber1.length; 
  for (var i = 0; i < abs; i++) { 
    longNumber1 = '0' + longNumber1; 
  } 
} 
 
var str = ''; //результат сложения двух чисел 
 
var currentNum = ''; //если в результате сложения число двузначное, то берем второе число и записываем на эту позицию 
var nextPos = 0; //и запоминаем единицу в будущем 
 
for (var i = longNumber1.length - 1; i >= 0; i--) { 
  if (Number(longNumber1[i]) + Number(longNumber2[i]) + nextPos < 10) { 
    str = Number(longNumber1[i]) + Number(longNumber2[i]) + nextPos + str; 
    nextPos = 0; 
  } else { 
    twoNumbers = Number(longNumber1[i]) + Number(longNumber2[i]) + nextPos; 
    currentNum = (String(twoNumbers).slice(1, 2)); //берем вторую цифру двузначного числа 
    str = currentNum + str; 
    nextPos = 1; //т.к число двузначное то мы должны прибавить единицу к след.цифре 
  } 
} 
 
if (nextPos) { str = '1' + str; } 
 
console.log(longNumber1); 
console.log(longNumber2); 
 
console.log(str);

Answer 2

function sum(a, b) { 
  a = [...a].reverse() 
  b = [...b].reverse() 
   
  for (var q=0; q<b.length; ++q) { 
    if ((a[q] = ~~a[q] + ~~b[q]) > 9) { 
      a[q] -= 10 
      b[q+1] = ~~b[q+1] + 1 
    } 
  } 
   
  return a.reverse().join("") 
} 
 
console.log(sum("999", "999")) 
console.log(sum("9", "999")) 
console.log(sum("999", "9")) 
 
var a = "536425458245238754832461239874613469012" 
var b =                      "908435378596458490" 
 
console.log(sum(a, b)) 
console.log(sum(b, a)) 
console.log(BigInt(a) + BigInt(b) + "")

Answer 3

Ещё один сумматор положительных чисел - на любое количество аргументов, заданных в виде строки или числа

function sum() { 
  let result = []; 
  let mind = 0; 
  let arr = [...arguments].map(a => [...a + ""].reverse()); 
  let length = arr.reduce((s, a) => s > a.length ? s : a.length, 0); 
  for (let i = 0; i < length; i++) { 
    let digits = arr.map(num => (+num[i]) | 0); 
    let value = digits.reduce((sum, digit) => digit + sum, 0) + mind; 
    mind = value / 10 | 0; 
    result.push((value % 10) + ""); 
  } 
  return ((mind || "") + result.reverse().join("")) || 0; 
} 
 
console.log(sum()); 
console.log(sum(123)); 
console.log(sum(123, '8933', 12345)); 
 
var a1 = '923456789012345678901234567890'; 
var a2 = '9876598765'; 
console.log(a1, '+', a2, '='); 
console.log(sum(a1, a2)); 
console.log(sum(a2, a2, a2, a2, a2, a2, a2, a2, a2, a2, a2, a2)); 
console.log((+a2) * 12);

Answer 4

function sum(a, b) { 
  var n = Math.max(a.length, b.length) 
 
  a = a.padStart(n, 0) 
  b = b.padStart(n, 0) 
 
  var res = Array(n), d = 0 
 
  for (var q=n-1; ~q; --q) { 
    if ((res[q] = d + +a[q] + +b[q]) > 9) { 
      d = 1, res[q] -= 10; 
    } else { 
      d = 0 
    } 
  } 
   
  if (d) { 
    res.unshift(1) 
  } 
   
  return res.join("") 
} 
 
console.log(sum("999", "999")) 
console.log(sum("9", "999")) 
console.log(sum("999", "9")) 
 
var a = "536425458245238754832461239874613469012" 
var b =                      "908435378596458490" 
 
console.log(sum(a, b)) 
console.log(BigInt(a) + BigInt(b) + "")

READ ALSO
scrollIntoView в элемент аккордеона

scrollIntoView в элемент аккордеона

Я делаю словарь русского языка в виде аккордеона, где каждое слово в своей ячейке

116
Уменьшить анимацию в два раза

Уменьшить анимацию в два раза

Как сделать чтобы сова была в 2 раза меньше?Нужно чтобы только сова стала в 2 раза меньше а все остальные элементы оставались без изменения

118