摘要:?jiǎn)栴}實(shí)現(xiàn)字符串類型的數(shù)字相加的一個(gè)方法??偨Y(jié)好的,最開始提到的問題已經(jīng)解決了,準(zhǔn)確的說,文中的代碼只是實(shí)現(xiàn)了超出范圍的正整數(shù)相加,不支持負(fù)整數(shù)和小數(shù),也許我們可以繼續(xù)去做點(diǎn)什么。
問題
實(shí)現(xiàn) 字符串類型的數(shù)字 相加的一個(gè)方法。
比如:
輸入 "11111111111111111" ,"22222222222222222",
返回 "33333333333333333"
JavaScript 能表示的最大安全整數(shù)是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下
超出范圍就會(huì)發(fā)生精度丟失,像這樣
至于更詳細(xì)的關(guān)于精度丟失的問題,推薦看這篇文章
該死的IEEE-754浮點(diǎn)數(shù),說「約」就「約」,你的底線呢?以JS的名義來好好查查你
這個(gè)問題中的兩個(gè)數(shù)字,都是超出范圍的,所以就不能簡(jiǎn)單的把兩個(gè)數(shù)字,轉(zhuǎn)為Number類型,進(jìn)行相加。
需要取兩個(gè)數(shù)字的每一位,進(jìn)行相加,大于10,就進(jìn)1,把結(jié)果保存在一個(gè)字符串中。
代碼function add(a,b){ // 保存最終結(jié)果 var res=""; // 保存兩位相加的結(jié)果 和 進(jìn)位值 var c=0; // 字符串轉(zhuǎn)數(shù)組 a = a.split(""); b = b.split(""); while (a.length || b.length || c){ // ~~ 用來把String類型 轉(zhuǎn)為 Number類型 // 把兩位相加的結(jié)果 和 進(jìn)位值相加 c += ~~a.pop() + ~~b.pop(); // 取余,把余數(shù)拼接到最終結(jié)果中 res = c % 10 + res; // 保存進(jìn)位,true 或者 false c = c>9; } return res; } add("11111111111111111","22222222222222222");解釋
1、~ 是JavaScript中的操作符,按位非,~~ 經(jīng)常用來進(jìn)行取整和類型轉(zhuǎn)換,他和顯示的用Number進(jìn)行類型轉(zhuǎn)換還是有區(qū)別的,比如處理 undefined 的時(shí)候。
而在兩個(gè)大整數(shù),長(zhǎng)度不一樣的時(shí)候,其中一個(gè)數(shù) 已經(jīng) pop 了所有數(shù)組中的元素之后,還要pop的話,就會(huì)返回 undefined ,所以如果用 Number 顯示的轉(zhuǎn)化,起碼要寫成這樣。
var ai = a.pop(); ai = ai===undefined? 0:Number(ai); var bi = b.pop(); bi = bi===undefined? 0:Number(bi); c += ai + bi;
明顯是用 ~~ 方便。
2、在保存進(jìn)位值的時(shí)候,用的并不是 1 和 0 ,而是true 和 false,這是因?yàn)殡[式類型轉(zhuǎn)換的時(shí)候,true會(huì)轉(zhuǎn)為1,false會(huì)轉(zhuǎn)為0。
好的,最開始提到的問題已經(jīng)解決了,準(zhǔn)確的說,文中的代碼只是實(shí)現(xiàn)了 超出范圍的正整數(shù)相加,不支持負(fù)整數(shù)和小數(shù),也許我們可以繼續(xù)去做點(diǎn)什么。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107729.html
摘要:排除直接使用的數(shù)太大或太小超出范圍,出現(xiàn)這種問題的情況基本是浮點(diǎn)數(shù)的小數(shù)部分在轉(zhuǎn)成二進(jìn)制時(shí)丟失了精度,所以我們可以將小數(shù)部分也轉(zhuǎn)換成整數(shù)后再計(jì)算。 // 1. 兩數(shù)相加 // 0.1 + 0.2 = 0.30000000000000004 // 0.7 + 0.1 = 0.7999999999999999 // 0.2 + 0.4 = 0.6000000000000001 // 2.2...
摘要:實(shí)現(xiàn)楊輝三角觀察這樣的一組數(shù),找出規(guī)律,用控制臺(tái)輸出這樣規(guī)律的數(shù)規(guī)律這是楊輝三角,每一行頭尾的數(shù)都是,其余的數(shù)是上一行對(duì)應(yīng)的數(shù)字相加,考慮使用遞歸算法。答案參考第一個(gè)數(shù)為最后一個(gè)數(shù)為中間的數(shù)為前一行的兩個(gè)數(shù)相加用來放第行的數(shù)字符串形式輸出 JS JavaScript實(shí)現(xiàn)楊輝三角 1 1 1 1 2 1 1 3 3 1 1 4 6...
摘要:本文通過介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來理解浮點(diǎn)數(shù)運(yùn)算精度問題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問題,不同場(chǎng)景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過浮點(diǎn)數(shù)運(yùn)算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
摘要:將羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字上的一道簡(jiǎn)單級(jí)別的題目將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字,其中羅馬數(shù)字的范圍在這題的關(guān)鍵在于了解需求,及如何將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字的規(guī)則為用作數(shù)字的羅馬字母共有七個(gè),即相同的數(shù)字連寫 將羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字 Leetcode上的一道簡(jiǎn)單級(jí)別的題目將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字,其中羅馬數(shù)字的范圍在1~3999 這題的關(guān)鍵在...
摘要:背包問題從給定的無序不重復(fù)的數(shù)組中,取出個(gè)數(shù),使其相加和為這個(gè)算法有很多擴(kuò)展,比如電商中購物車中的計(jì)算,滿減,不滿會(huì)在熱銷商品中進(jìn)行推薦填充。 背包問題:從給定的無序、不重復(fù)的數(shù)組 A 中,取出 N 個(gè)數(shù),使其相加和 為 M 這個(gè)算法有很多擴(kuò)展,比如電商中購物車中的計(jì)算,滿100減20,不滿100會(huì)在熱銷商品中進(jìn)行推薦填充。 function getCombBySum(array,su...
閱讀 3503·2023-04-26 00:39
閱讀 4701·2021-09-22 10:02
閱讀 2582·2021-08-09 13:46
閱讀 1127·2019-08-29 18:40
閱讀 1474·2019-08-29 18:33
閱讀 797·2019-08-29 17:14
閱讀 1543·2019-08-29 12:40
閱讀 3005·2019-08-28 18:07