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 位存儲數(shù)值。其中 0~51
存儲數(shù)字片段,52~62
存儲指數(shù),63
位存儲符號。
來看看 JavaScript
中數(shù)字的最大值和最小值:
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308 console.log(Number.MIN_VALUE); // 5e-324
注:
這里的最大值指的是字面意思上的最大值;
最小值則指的是正數(shù)情況下小數(shù)點(diǎn)后能表示的最小值。
一、實(shí)現(xiàn)兩個大數(shù)相加
思路:
大數(shù)可能會超出 JavaScript
的數(shù)字類型范圍,超出后結(jié)果損失精度,所以可以用字符串的方式來存儲大數(shù)。
題解:
let a = "9876543210123456789000000000123"; let b = "1234567898765432100000012345678901"; function add(str1, str2) { // 獲取兩個數(shù)字的最大長度 let maxLength = Math.max(str1.length, str2.length); // 用0補(bǔ)齊長度,讓它們兩個長度相同 str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123" str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901" let temp = 0; // 每個位置相加之和 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; // 獲取下一個進(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)兩個大數(shù)相乘
給定兩個以字符串形式表示的非負(fù)整數(shù) num1
和 num2
,返回 num1
和 num2
的乘積,它們的乘積也表示為字符串形式。
思路:
- 首先,兩個多位數(shù)相乘,我們可以分解成其中一個多位數(shù)和另一個多位數(shù)的每一位相乘
- 這里利用的思路和上面的大數(shù)相加一致
- 得到其每一位相乘的結(jié)果后,在其結(jié)果后面補(bǔ)齊相應(yīng)的0,并將其放入結(jié)果數(shù)組中
- 最后,用上述大數(shù)相加的函數(shù),對結(jié)果數(shù)組進(jìn)行累加,即可得到最終的相乘字符串了。
- 需要注意的點(diǎn)是相乘的兩數(shù)其中之一可能是0,所以最后一步需要將左側(cè)的0(除了最右邊的一位)全部去掉
function multiply(str1, str2) { let result = ""; const multiplyArr = []; let count = 0; // 當(dāng)前位數(shù)(從個位開始) // 用位數(shù)少的每一位去乘位數(shù)多的,這樣需要的存儲空間更小,運(yùn)算速度更快 if(str1.length < str2.length) { [str1, str2] = [str2, str1]; } // 循環(huán)用第二個數(shù)的每一位乘以第一個數(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] // 從第一個開始累加 for(let i=1; i<multiplyArr.length; i++) { result = add(result, multiplyArr[i]); } // 去除末尾以外的前置0 result = removeLeftZero(result); return result; } /** * 多位數(shù)乘單個數(shù) */ function manyMultiplyOne(many, one) { let temp = 0; // 每個位置相乘的結(jié)果 let flag = 0; // 進(jìn)位數(shù) let result = ""; // 進(jìn)行每一位的乘法運(yùn)算,并進(jìn)行進(jìn)位操作(從后往前操作,代表從最小位置開始:個十百千萬) 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) { // 獲取兩個數(shù)字的最大長度 let maxLength = Math.max(str1.length, str2.length); // 用0補(bǔ)齊長度,讓它們兩個長度相同 str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123" str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901" let temp = 0; // 每個位置相加之和 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; // 獲取下一個進(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; // 計算從頭部開始,有幾個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); }
以上就是JS實(shí)現(xiàn)大數(shù)相加大數(shù)相乘示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JS大數(shù)相加相乘的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一款功能強(qiáng)大的markdown編輯器tui.editor使用示例詳解
這篇文章主要為大家介紹了一款功能強(qiáng)大的markdown編輯器tui.editor使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02JS屬性scrollTop?clientHeight?scrollHeight理解學(xué)習(xí)
這篇文章主要為大家介紹了JS屬性scrollTop?clientHeight?scrollHeight理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11微信小程序 action-sheet詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序 action-sheet詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11微信小程序 input表單與redio及下拉列表的使用實(shí)例
這篇文章主要介紹了微信小程序 input表單與redio及下拉列表的使用實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09