簡體   English   中英

Javascript 不使用解析添加兩個字符串數字

[英]Javascript add two numbers that are string without using parse

對於表示為字符串的非負整數num1num2 ,返回num1num2之和。

我的解決方案是創建一個具有 indexOf 和數字值的過濾器。

const addStrings = function(num1, num2) {
    let filter = "0123456789";
    
    let x = 0;
    for(let i=0; i<num1.length; i++) {
        x = x + (filter.indexOf(num1[i]) * Math.pow(10, num1.length-1-i));
    }
    
    let y = 0;
    for(i=0; i<num2.length; i++) {
        y = y + (filter.indexOf(num2[i]) * Math.pow(10, num2.length-1-i));
    }
    
    return (x+y).toString();
};

它在大多數情況下都有效。 但是,如果輸入是:

"9333852702227987"
"85731737104263"

它將返回錯誤的總和:“9419584439332252”。 我不明白為什么它錯誤地轉換了數字。

我創建了一個 object,其鍵是 digit1、digit2 和進位 - 全部作為字符串。
function 采用兩個字符串數字並將它們“逐位”相加(實際上,逐個字符,作為 object + 進位的鍵)。
“數字”的限制是字符串長度的限制(進位減 1)。
這甚至可以適用於處理小數(我把它留給你)。

這是我的代碼:

var sumObject={};
for(var i=0; i<=9; i++) {
  for(var j=0; j<=9; j++) {
    var sum, carry, digit, obj;
    sum=i+j;
    carry=sum>9?"1":"0";
    digit=sum%10;
    obj={sum:""+digit, carry:carry};
    sumObject[""+i+j+"0"]=obj;
    sum=i+j+1;
    carry=sum>9?"1":"0";
    digit=sum%10;
    obj={sum:""+digit, carry:carry};
    sumObject[""+i+j+"1"]=obj;
  }
}

function sum2StringedNumbers(sn1, sn2) {
  var answer="";
  var maxLength=Math.max(sn1.length, sn2.length);
  sn1=("0".repeat(maxLength)+sn1).slice(-maxLength);
  sn2=("0".repeat(maxLength)+sn2).slice(-maxLength);
  var carry="0";
  for(var i=maxLength; i>0; i--) {
    var key=""+sn1.charAt(i-1)+sn2.charAt(i-1)+carry;
    var answer=sumObject[key].sum+answer;
    carry=sumObject[key].carry;
  }
  if(carry=="1") answer="1"+answer;
  return answer;
}

這些數字的總和大於Number.MAX_SAFE_INTEGER 您需要改用BigInt

 const addStrings = function(num1, num2) { let filter = "0123456789"; let x = 0n; for(let i=0; i<num1.length; i++) { x = x + (BigInt(filter.indexOf(num1[i])) * 10n ** BigInt(num1.length-1-i)); } let y = 0n; for(i=0; i<num2.length; i++) { y = y + (BigInt(filter.indexOf(num2[i])) * 10n ** BigInt(num2.length-1-i)); } return (x+y).toString(); }; console.log(addStrings("9333852702227987","85731737104263"));

您可以跳過很多代碼並將您的字符串直接轉換為 BigInt 並從那里計算。 然后使用toString()將其恢復為字符串。 一探究竟:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

(BigInt("9333852702227987") + BigInt("85731737104263")).toString();
// 9419584439332250

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM