JavaScript實現 超範圍的數 相加
問題
實現 字串型別的數字 相加的一個方法。
比如:
輸入 '11111111111111111'
,'22222222222222222'
,
返回 '33333333333333333'
解決思路
JavaScript 能表示的最大安全整數是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER
看一下
超出範圍就會發生精度丟失,像這樣
這個問題中的兩個數字,都是超出範圍的,所以就不能簡單的把兩個數字,轉為Number型別,進行相加。
需要取兩個數字的每一位,進行相加,大於10,就進1,把結果儲存在一個字串中。
程式碼
function add(a,b){
// 儲存最終結果
var res='';
// 儲存兩位相加的結果 和 進位值
var c=0;
// 字串轉陣列
a = a.split('');
while (a.length || b.length || c){
// ~~ 用來把String型別 轉為 Number型別
// 把兩位相加的結果 和 進位值相加
c += ~~a.pop() + ~~b.pop();
// 取餘,把餘數拼接到最終結果中
res = c % 10 + res;
// 儲存進位,true 或者 false
c = c>9;
}
return res;
}
add('11111111111111111','22222222222222222');
解釋
1、~
是JavaScript中的操作符,按位非,~~
經常用來進行取整和型別轉換,他和顯示的用Number進行型別轉換還是有區別的,比如處理 undefined
的時候。
而在兩個大整數,長度不一樣的時候,其中一個數 已經 pop 了所有陣列中的元素之後,還要pop的話,就會返回 undefined
,所以如果用 Number 顯示的轉化,起碼要寫成這樣。
var ai = a.pop();
ai = ai===undefined? 0:Number(ai);
var bi = b.pop();
bi = bi===undefined? 0:Number(bi);
c += ai + bi;
明顯是用 ~~
方便。
2、在儲存進位值的時候,用的並不是 1 和 0 ,而是true 和 false,這是因為隱式型別轉換的時候,true會轉為1,false會轉為0。
總結
好的,最開始提到的問題已經解決了,準確的說,文中的程式碼只是實現了 超出範圍的正整數相加,不支援負整數和小數,也許我們可以繼續去做點什麼。
相關推薦
JavaScript實現超範圍大數相加
原理就是把數轉成字串,實現字串每位相加 function add(a,b){ var res = ''; var c = 0; a = a.split(''); b
JavaScript實現 超範圍的數 相加
問題 實現 字串型別的數字 相加的一個方法。 比如: 輸入 '11111111111111111' ,'22222222222222222', 返回 '33333333333333333' 解決思路 JavaScript 能表示的最大安全整數是
演算法:通過邏輯運算實現兩數相加
* @Description 不使用加減乘除來實現數字的相加 寫一個函式,* 求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。 程式碼: int add(int num1,int num2){ if(0==num2)
C語言實現兩數相加2018-09-23
/*給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 0
go實現兩數相加(領釦題目)
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6
連結串列實現兩數相加
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -
JSP 簡單入門教學(2): 點選按鈕實現兩數相加加法運算的 兩種 實現方法
我們要實現頁面效果:瞭解過html的都知道,提交資料用的是form表單,表單中的內容是被髮送出去的內容。大部分開發都是這樣的,先畫ui後考慮功能,所以我們先用程式碼表示出這個介面:<form ac
javascript實現引用數據類型的深拷貝和淺拷貝詳解
var struct blue name 拷貝 ont javascrip ceo ole 關於引用類型值的詳解,請看另一篇隨筆 https://www.cnblogs.com/jinbang/p/10346584.html 深拷貝和淺拷貝,也就是引用數據類型棧和堆的知
JavaScript實現——兩數之和
題目 給定整數的一個數組,找出這樣的兩個數,他們的加和等於一個特定的目標數字(target)。 輸入:numbers={2,7,11,15},target=9 輸出:index=1,index=2
使用javascript實現1到100的數依次相加,並將結果列印在頁面上
這算是我的第二個javascript程式,今天學了一些關於它的運演算法、操作符、邏輯運算、函式、不能被過載、變數申明的作用域、包裝類、引用等知識,因內容較多,而且比較雜,故沒有寫下筆記,書
JavaScript實現對象數組按不同字段排序
per ava com return pre 但是 alert 方法 使用 如果有一個對象數組,我們想要依據某個對象屬性對數組進行排序。而傳遞給數組sort()方法的比較函數要接收兩個參數,即要比較的值。但是。我們須要一種方式來指明依照哪個屬性來排序。要解
javascript實現數據結構----棧
peek 有序 javascrip items 修改 添加 數據結構 java turn //棧是一種遵從後進先出原則的有序集合。 //新添加的或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端就叫棧底 //在棧裏,新元素都靠近棧頂,舊元素都叫做棧底
JavaScript實現數組亂序
效果 http 這就是 排序 ray 存在 cti 從大到小 cnblogs 通常我們用的最多的就是把一個無規則的數組按照從大到小或者從小到大的順序排列,然而有的時候我們可能會遇到將一個有序的數組打亂,實現隨機排序的效果,這就是我今天要給 大家介紹的內容了; 首先我
兩數相加 go實現
給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例: 輸入:(2
LeetCode題庫2:兩數相加——JavaScript解答
題目描述: 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例
LeetCode第二題:兩數相加(addTwoNumbers)的Python3實現。
題目描述:You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of t
實現一個add()函式-兩數相加(不能使用四則運算以及++--)
當我們被問到這個問題時,都在想既然是兩數相加,那必然要使用到四則運算或者自增自減。 如果不用四則運算,那我們就要想想十進位制數之間是怎麼進行加法的。比如要計算14+7=21。我們可以通過三步來計算,(
[leetcode]各數相加[javascript]
https://leetcode-cn.com/problems/add-digits/ 描述 給定一個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。示例: 輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於
Django & JavaScript 用Ajax實現JSON數據的請求和響應
UNC else admin ros cat nbsp ejs -c var 【描述】 1.Server端定義了兩個字段:Article.title 和 Article.content 2.客戶端用JavaScript Ajax異步加載請求服務器的JSON數據 效果是點擊按
用Javascript實現通過選擇週數顯示開始日和結束日
最近在一個專案中遇到一個查詢頁面,其中一個查詢條件是根據選擇的年份、月以及週數顯示選擇的該周從幾號到幾號,這樣一個需求。在網上搜索了一下,有類似的但是沒有完全一樣的,只好自己動手。思路是首先取得所選擇的該年月1號這一天是星期幾,然後算出這一週中週一的日期。以此為基點,第1周