大數運算—大數加法、減法、乘法、除法詳解
阿新 • • 發佈:2021-04-02
>原創公眾號:[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`的過程,如