1. 程式人生 > >大數運算—大數加法、減法、乘法、除法詳解

大數運算—大數加法、減法、乘法、除法詳解

>原創公眾號:[bigsai](https://mp.weixin.qq.com/s/IW_GNK254ijIuuupjJsKCA) >原創不易,如果有收穫請不要吝嗇你的**一鍵三連**! ### 前言 大家好,我是bigsai!最近,大數加減頻頻登上筆試的舞臺,小夥伴們在群裡也分享自己遇到面試官碰到大數運算的題目,想著這麼**重要而簡單**的知識點我還沒寫過,那得好好和大家一起總結一下。 ![image-20210331190632569](https://img-blog.csdnimg.cn/img_convert/0543d6c47966771003d6fdbda0de7d8c.png) 各位有過分類刷題的小夥伴,可能看到很多人分類 字串、貪心、動態規劃、bfs、dfs、**大數**、數論等,初聽大數,你可能會差異:大數是個啥?聽起來怪高大上的。 ![image-20210329191141360](https://img-blog.csdnimg.cn/img_convert/fc6bf33df4eead0476c086931396c4b2.png) 大數,其實就是很大很大數字(可能遠超32、64位,基礎型別無法表示)的加減法,在Java中我們可以使用一個大數類(BigInteger等)很容易解決大數的各種運算,但如果遇到面試官他肯定會讓你手寫的。 這個數字一般用字串、連結串列等形式表示、返回,大數運算的核心就是:**模擬**,模擬我們日常用紙筆算數字的加減乘除流程,然後再根據計算機、程式語言等特性適當儲存計算即可,不過,大數除法運算稍微特殊一點,和我們直接模擬的思維方式稍有不同。 ### 大數加法 大數加法是最簡單的,簡單模擬即可。首先,我們想一下兩個數加法的流程:從右向左計算求和、進位,一直到最後。 在程式語言中同樣也是模擬從右向左逐位相加的過程,不過在具體實現上需要注意一些細節。 1、列舉字串將其轉換程`char[]`提高效率 2、從右往左進行計算,可以將結果放到一個數組中最後組成字串,也可以使用StringBuider拼接,拼接的時候最後要逆置一下順序。 3、餘數每次疊加過需要清零,兩數相加如果大於等於10即有餘數,新增到結果中該位置的數也應該是該數%10的結果。 4、計算完最後還要看看餘數是否為1,如果為1需要將其新增到結果,例如 `"991"+"11"`算三個位置為`002`但還有一個餘數需要新增,所以應該是`1002`。 ![一個加法流程](https://img-blog.csdnimg.cn/img_convert/2e12d0adf344cff0bf7f64c20f378de9.png) 當然在具體實現上方法較多,你可以首先就將字串逆置然後從前往後就可以計算了。當然我這裡實現的是字串從後向前各個位對應計算,然後將結果順序新增到StringBuilder上。 這題在力扣【[415兩數相加](https://leetcode-cn.com/problems/add-strings/)】可以檢驗自己程式碼,實現程式碼為: ```java public String addStrings(String num1, String num2) { // 公眾號:bigsai 歡迎你的關注 int len1=num1.length()-1,len2=num2.length()-1; char ch1[]=num1.toCharArray(); char ch2[]=num2.toCharArray(); StringBuilder sb=new StringBuilder(); int remainder =0;//計算餘數 while (len1>=0||len2>=0) { int n1=len1>=0?(ch1[len1--]-'0'):0; int n2=len2>=0?(ch2[len2--]-'0'):0; int num=n1+n2+remainder;//求和對應數字 remainder=num/10;//是否進位 sb.append(num%10);// 新增到結果字串中 } if(remainder>0)//是否還需要進位 { sb.append(remainder); } //反裝即為結果 return sb.reverse().toString(); } ``` ### 大數減法 加法對應的就是減法,有了上面大數加法的實現思路,那麼我想你在大數減法也應該有點想法,但是減法和加法不同的是減法有位置的區別,**加法需要進位而減法需要借位**。並且大整正數減法可能產生正負也不一定。 兩個正數,如果大數減去小數,那麼一切正常,結果是一個正數;**但如果小數減去大數,那麼結果將是一個負數,並且結果處理起來比較麻煩**。 所以在這裡全部轉成大-小處理(大-小不存在不能借位的情況)。 ![減法轉成大-小](https://img-blog.csdnimg.cn/img_convert/beca4ed50cdb8f364781745e9a105143.png) 1、執行計算前首先比較減數(`num1`)和被減數(`num2`)的大小,如果`num1>num2`,那麼就模擬`num1-num2`的過程,如