2016-03-18 7 views
0

В настоящее время я застрял на вызов Codewars, что я не могу получить мою голову вокруг:Сумма Большой Целые

Учитывая строковое представление двух целых чисел, возвращает строковое представление этих чисел, например, sumStrings('1','2') // => '3'

Я использовал следующий код до сих пор, но он не будет работать на большом тестовом число, как число преобразуется в научную нотацию:

function sumStrings(a,b) { 
    var res = +a + +b; 
    return res.toString(); 
} 

Любой помощь будет оценен.

Редактировать:

Фидл пример: https://jsfiddle.net/ag1z4x7d/

+0

показать нам скрипку, где она терпит неудачу ... – Rayon

+0

Возможный дубликат [Как избежать научной нотации для больших чисел в JavaScript?] (Http://stackoverflow.com/questions/1685680/how-to-avoid-scientific-notation-for-large-numbers-in -javascript) – epoch

+0

Кстати, [это вызов] (http://www.codewars.com/kata/sum-strings-as-numbers/javascript). – Zeta

ответ

1

Проблема заключается в том, что в этом конкретном ката (IIRC), число хранится в a и b являются слишком большими для обычного 32-битового целого числа, и арифметика с плавающей запятой не является точной. Поэтому ваша версия не вернет правильное значение:

sumStrings('100000000000000000000', '1') 
// returns '100000000000000000000' instead of '100000000000000000001' 

Вы должны убедиться, что этого не происходит. Одним из способов является сделать хороший старомодный переноса на основе сложения и оставаться на основе цифр/символов в мире на протяжении всего расчета:

function sumStrings(a, b) { 
    var digits_a = a.split('') 
    var digits_b = b.split('') 
    ... 
} 
0

function sumStrings(a, b) {         // sum for any length 
 
    function carry(value, index) {        // cash & carry 
 
     if (!value) {           // no value no fun 
 
      return;           // leave shop 
 
     } 
 
     this[index] = (this[index] || 0) + value;    // add value 
 
     if (this[index] > 9) {         // carry necessary? 
 
      carry.bind(this)(this[index]/10 | 0, index + 1); // better know this & go on 
 
      this[index] %= 10;         // remind me later 
 
     } 
 
    } 
 

 
    var array1 = a.split('').map(Number).reverse(),   // split stuff and reverse 
 
     array2 = b.split('').map(Number).reverse();   // here as well 
 

 
    array1.forEach(carry, array2);        // loop baby, shop every item 
 
    return array2.reverse().join('');       // return right ordered sum 
 
} 
 

 
document.write(sumStrings('999', '9') + '<br>'); 
 
document.write(sumStrings('9', '999') + '<br>'); 
 
document.write(sumStrings('1', '9999999999999999999999999999999999999999999999999999') + '<br>');