溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JS如何實(shí)現(xiàn)大數(shù)相加大數(shù)相乘

發(fā)布時(shí)間:2022-08-08 16:06:15 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JS如何實(shí)現(xiàn)大數(shù)相加大數(shù)相乘”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“JS如何實(shí)現(xiàn)大數(shù)相加大數(shù)相乘”文章能幫助大家解決問題。

JS大數(shù)相加、大數(shù)相乘

JavaScript 只有一種數(shù)字類型,可以使用也可以不使用小數(shù)點(diǎn)來書寫數(shù)字。

JavaScript 中,數(shù)字不分為整數(shù)類型和浮點(diǎn)數(shù)類型,所有的數(shù)字都是浮點(diǎn)數(shù)類型JavaScript 采用 IEEE754 標(biāo)準(zhǔn)定義的 64 位浮點(diǎn)格式表示數(shù)字,此格式用 64 位存儲(chǔ)數(shù)值。其中 0~51存儲(chǔ)數(shù)字片段,52~62存儲(chǔ)指數(shù),63 位存儲(chǔ)符號(hào)。

來看看 JavaScript 中數(shù)字的最大值最小值

console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
console.log(Number.MIN_VALUE); // 5e-324

注:

這里的最大值指的是字面意思上的最大值;

最小值則指的是正數(shù)情況下小數(shù)點(diǎn)后能表示的最小值。

一、實(shí)現(xiàn)兩個(gè)大數(shù)相加

思路:

大數(shù)可能會(huì)超出 JavaScript數(shù)字類型范圍,超出后結(jié)果損失精度,所以可以用字符串的方式來存儲(chǔ)大數(shù)。

題解:

let a = "9876543210123456789000000000123";
let b = "1234567898765432100000012345678901";
function add(str1, str2) {
  // 獲取兩個(gè)數(shù)字的最大長度
  let maxLength = Math.max(str1.length, str2.length);
  // 用0補(bǔ)齊長度,讓它們兩個(gè)長度相同
  str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123"
  str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901"
  let temp = 0; // 每個(gè)位置相加之和
  let flag = 0; // 進(jìn)位:相加之和如果大于等于10,則需要進(jìn)位
  let result = "";
  for(let i=maxLength-1; i>=0; i--) {
    // 獲取當(dāng)前位置的相加之和:字符串1 + 字符串2 + 進(jìn)位數(shù)字
    temp = parseInt(str1[i]) + parseInt(str2[i]) + flag;
    // 獲取下一個(gè)進(jìn)位
    flag = Math.floor(temp/10);
    // 拼接結(jié)果字符串
    result = temp%10 + result;
  }
  if(flag === 1) {
    // 如果遍歷完成后,flag還剩1,說明兩數(shù)相加之后多了一位,類似于:95 + 10 = 105
    result = "1" + result;
  }
  return result;
}

二、實(shí)現(xiàn)兩個(gè)大數(shù)相乘

給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1num2,返回 num1num2 的乘積,它們的乘積也表示為字符串形式。

思路:

  • 首先,兩個(gè)多位數(shù)相乘,我們可以分解成其中一個(gè)多位數(shù)另一個(gè)多位數(shù)的每一位相乘

    • 這里利用的思路和上面的大數(shù)相加一致

  • 得到其每一位相乘的結(jié)果后,在其結(jié)果后面補(bǔ)齊相應(yīng)的0,并將其放入結(jié)果數(shù)組中

  • 最后,用上述大數(shù)相加的函數(shù),對(duì)結(jié)果數(shù)組進(jìn)行累加,即可得到最終的相乘字符串了。

  • 需要注意的點(diǎn)是相乘的兩數(shù)其中之一可能是0,所以最后一步需要將左側(cè)的0(除了最右邊的一位)全部去掉

function multiply(str1, str2) {
  let result = "";
  const multiplyArr = [];
  let count = 0; // 當(dāng)前位數(shù)(從個(gè)位開始)
  // 用位數(shù)少的每一位去乘位數(shù)多的,這樣需要的存儲(chǔ)空間更小,運(yùn)算速度更快
  if(str1.length < str2.length) {
    [str1, str2] = [str2, str1];
  }
  // 循環(huán)用第二個(gè)數(shù)的每一位乘以第一個(gè)數(shù)
  for(let i=str2.length-1; i>=0; i--) {
    let multiplyItem = manyMultiplyOne(str1, str2[i]); // 獲取多位數(shù)乘單位數(shù)的結(jié)果
    multiplyArr[count] = multiplyItem.padEnd(multiplyItem.length + count, "0"); // 進(jìn)行補(bǔ)0操作
    count++;
  }
  // 接下來,將multiplyArr中的每一項(xiàng)累加,就能得到最終的結(jié)果了
  result = multiplyArr[0] // 從第一個(gè)開始累加
  for(let i=1; i<multiplyArr.length; i++) {
    result = add(result, multiplyArr[i]);
  }
  // 去除末尾以外的前置0
  result = removeLeftZero(result);
  return result;
}
/**
 * 多位數(shù)乘單個(gè)數(shù)
 */
function manyMultiplyOne(many, one) {
  let temp = 0; // 每個(gè)位置相乘的結(jié)果
  let flag = 0; // 進(jìn)位數(shù)
  let result = "";
  // 進(jìn)行每一位的乘法運(yùn)算,并進(jìn)行進(jìn)位操作(從后往前操作,代表從最小位置開始:個(gè)十百千萬)
  for(let i=many.length-1; i>=0; i--) {
    temp = many[i] * one + flag; // 獲取當(dāng)前項(xiàng)的乘積
    flag = Math.floor(temp/10); // 獲取進(jìn)位數(shù)
    result = temp%10 + result;
  }
  // 最后,如果進(jìn)位還要剩下,則將進(jìn)位放在最前面
  if(flag !== 0) {
    result = flag + result;
  }
  return result;
}
// 兩數(shù)相加,用的上面介紹的函數(shù)
function add(str1, str2) {
  // 獲取兩個(gè)數(shù)字的最大長度
  let maxLength = Math.max(str1.length, str2.length);
  // 用0補(bǔ)齊長度,讓它們兩個(gè)長度相同
  str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123"
  str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901"
  let temp = 0; // 每個(gè)位置相加之和
  let flag = 0; // 進(jìn)位:相加之和如果大于等于10,則需要進(jìn)位
  let result = "";
  for(let i=maxLength-1; i>=0; i--) {
    // 獲取當(dāng)前位置的相加之和:字符串1 + 字符串2 + 進(jìn)位數(shù)字
    temp = parseInt(str1[i]) + parseInt(str2[i]) + flag;
    // 獲取下一個(gè)進(jìn)位
    flag = Math.floor(temp/10);
    // 拼接結(jié)果字符串
    result = temp%10 + result;
  }
  if(flag === 1) {
    // 如果遍歷完成后,flag還剩1,說明兩數(shù)相加之后多了一位,類似于:95 + 10 = 105
    result = "1" + result;
  }
  return result;
}
function removeLeftZero(str) {
  let count = 0; // 計(jì)算從頭部開始,有幾個(gè)0
  for(let i=0; i<str.length; i++) {
    if(str[i] === "0" && i < str.length - 1) {
      count++;
    } else {
      break;
    }
  }
  return str.substr(count, str.length);
}

關(guān)于“JS如何實(shí)現(xiàn)大數(shù)相加大數(shù)相乘”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI