linux编译两个整数相加,常考面试题之两个字符串相加(长整数相加)
無論你面試的是什么崗位,應(yīng)該都或多或少看到過這個問題 - 兩個長整數(shù)相加要怎么實(shí)現(xiàn)。如果a和b的位數(shù)不大,確實(shí)直接用類型轉(zhuǎn)換就可以求出a+b了,但是萬一a和b的位數(shù)都是幾百位呢,早就溢出了,這時候要怎么計(jì)算呢?
這種情況下,有三種解決方法可供選擇:
一、 用字符串來存儲a和b的值;
二、 用數(shù)組來存儲a和b的值;
三、 用鏈表來存儲a和b的值。
這三種方法都有一個共同點(diǎn),就是無論哪一種方法,都可以不用擔(dān)心因?yàn)閿?shù)字太大而造成數(shù)值溢出出錯。而它們的解決思路也都大同小異,下面我們來分析解決思路。
做這種題的時候,我有一個慣性思維,就是用我們現(xiàn)實(shí)中的解題思路來教給計(jì)算機(jī),讓它也用這種方法來解決。回憶一下我們小學(xué)的時候,老師是不是教我們做加法的時候,要從最后一位開始加,遇到十的時候就要進(jìn)行進(jìn)位,直至兩個數(shù)都加完。在編程中,我們也可以用這個思路來進(jìn)行做題:
先找到a和b的最后一位,將這兩個一位數(shù)相加并假設(shè)它存在tmp中,如果tmp大于9,那么就說明需要進(jìn)位了,這時候加入一個標(biāo)識表示是否需要進(jìn)位,比如說我們拿addOne作為標(biāo)識,那么這時候我們就需要將addOne置為1,然后tmp對10進(jìn)行取模,就可以得到當(dāng)前位置上的實(shí)際數(shù)值了,再對a和b的倒數(shù)第二位進(jìn)行重復(fù)的操作...直至將a和b遍歷完就結(jié)束。下面這段代碼是用第二種方法來解決的,大家可以參考一下:
1 //方法二:將數(shù)字轉(zhuǎn)化為數(shù)組再進(jìn)行相加
2 functionadd(num1, num2){3 //將num1和num2轉(zhuǎn)為數(shù)組,每格存儲一位,比如num1 = “12345”,轉(zhuǎn)成數(shù)組a之后就變成["1", "2", "3", "4", "5"]
4 let a = String.prototype.split.call(num1, "");5 let b = String.prototype.split.call(num2, "");6 //用來存儲結(jié)果
7 let res =[];8 let addOne = 0; //用于判斷是否需要金威
9 //當(dāng)a和b其中一個不為空時,各取出最后一位數(shù)字并相加,如果其中一個先為空了,則將它置為0
10 while(a.length ||b.length){11 let item1 = parseInt(a.pop()) | 0;12 let item2 = parseInt(b.pop()) | 0;13 let tmp = item1 + item2 +addOne;14 if(tmp > 9){15 addOne = 1;16 tmp %= 10;17 }else{18 addOne = 0;19 }20 //unshift是js中的一個操作方法,array.unshift(item)表示在數(shù)組array的最前面插入item
21 res.unshift(tmp)22 }23 //當(dāng)a和b都全部加完了之后,再最后一次判斷是否需要進(jìn)位
24 if(addOne) res.unshift(1);25 //最后利用join把數(shù)組轉(zhuǎn)成字符串并返回
26 return res.join('');27 }
其他兩種方法做起來也都大同小異,思路是一樣的,只不過是實(shí)際操作起來的方法會有所不同,大家可以自己探索一下。
總結(jié)
以上是生活随笔為你收集整理的linux编译两个整数相加,常考面试题之两个字符串相加(长整数相加)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 等待子线程退出,等待一组子线
- 下一篇: 向日葵win10远程linux主机,大神