java中超過long范圍的超大整數(shù)相加算法詳解(面試高頻)
java里有數(shù)字long來表示大的整數(shù),如果兩個數(shù)字的范圍超過了long,要做加法算法怎么做呢?
這個問題在面試中經(jīng)常碰到,如果之前沒有經(jīng)歷的,可能一時有點想不起來怎么做。
下面我們來分析一下,兩個數(shù)字超過了long的范圍,那顯然不能用java中的基本數(shù)字類型來計算了。
我們可以想小時候剛學(xué)習(xí)加法的豎式運算,個位對個位,十位對十位,百位對百位、、、以此類推。當(dāng)個位滿十向十位進1,十位滿十向百位進1、、、以此類推,就這樣完成了運算。
表示出來如下:
1 4 5
+ 2 6 9
-------------
4 1 4
受此啟發(fā)我們可以做這道題了,數(shù)字如果超過了long的范圍那顯然在java里是以String類型呈現(xiàn)的,下面我們上代碼。
package com.wandou.demo.algorithm.post; import org.junit.Test; /** * @author liming * @date 2020-08-19 * @description 算法 */ public class BigNumAddDemo { @Test public void bigintegerAddTest() { System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE); bigNumAdd("111", "2010"); bigNumAdd(Long.MAX_VALUE + "", Long.MAX_VALUE + ""); bigNumAdd(Long.MAX_VALUE + "", "10"); } public void bigNumAdd(String strNum1, String strNum2) { char[] chars1 = strNum1.toCharArray(); char[] chars2 = strNum2.toCharArray(); int len1 = chars1.length; int len2 = chars2.length; boolean oneBiger = len1 > len2; int len = Integer.max(len1, len2); StringBuilder targetSb = new StringBuilder(); //進位 int carry = 0; for (int i = 0; i < len; i++) { int temp; int idx1 = len1 - 1 - i; int idx2 = len2 - 1 - i; if (oneBiger) { if (i < len2) { temp = Integer.parseInt(chars1[idx1] + "") + Integer.parseInt(chars2[idx2] + "") + carry; } else { temp = Integer.parseInt(chars1[idx1] + "") + carry; } } else { if (i < len1) { temp = Integer.parseInt(chars1[idx1] + "") + Integer.parseInt(chars2[idx2] + "") + carry; } else { temp = Integer.parseInt(chars2[idx2] + "") + carry; } } carry = 0; if (temp > 9) { carry = 1; targetSb.append(temp - 10); } else { targetSb.append(temp); } } System.out.println(targetSb.reverse().toString()); } }
測試結(jié)果:
總結(jié)
到此這篇關(guān)于java中超過long范圍的超大整數(shù)相加算法(面試高頻)的文章就介紹到這了,更多相關(guān)java超過long超大整數(shù)相加算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java學(xué)生信息管理系統(tǒng)MVC架構(gòu)詳解
這篇文章主要為大家詳細介紹了java學(xué)生信息管理系統(tǒng)MVC架構(gòu)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06JavaFX桌面應(yīng)用未響應(yīng)問題解決方案
這篇文章主要介紹了JavaFX桌面應(yīng)用未響應(yīng)問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07SpringBoot?Schedule調(diào)度任務(wù)的動態(tài)管理
Scheduled定時任務(wù)是Spring?boot自身提供的功能,所以不需要引入Maven依賴包,下面這篇文章主要給大家介紹了關(guān)于SpringBoot通過@Scheduled實現(xiàn)定時任務(wù)以及問題解決的相關(guān)資料,需要的朋友可以參考下2023-02-02Java中一維二維數(shù)組的靜態(tài)和動態(tài)初始化
今天通過本文給大家分享Java中的數(shù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動態(tài)初始化問題,感興趣的朋友一起看看吧2017-10-10springboot整合cxf發(fā)布webservice以及調(diào)用的方法
這篇文章主要介紹了springboot整合cxf發(fā)布webservice以及調(diào)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08