相關介紹:html
在java中,整數是有最大上限的。所謂大數是指超過整數最大上限的數,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 432 123 212 443就是兩個大數,在java中這是沒法用整型int變量或長整型long變量來進行保存的,更不用說保存他們之間相加的和了。爲解決該問題,能夠把兩個相加數當作是字符串,將這些數的相應數字存儲在兩個堆棧中,並從兩個棧中彈出對應位的數字依次執行加法可獲得結果,以784和8465爲例進行加法的計算過程。java
對於兩個大數的加法,其操做步驟概括以下:測試
其代碼以下:spa
package queueandstack;
import java.util.Stack;
/** * 該類用於演示大數加法的相關代碼 * @author 學徒 * */ public class BigNumberAdd { /** * 求兩個大數的和,加數與被加數以字符串的形式輸入(容許大數中出現空格),計算的結果也以字符串的形式返回 */ public String add(String number1,String number2)throws Exception { Stack result=new Stack();//大數的和 Stack number1Stack=numberSplit(number1);//加數字符串以單個字符的形式放入棧中 Stack number2Stack=numberSplit(number2);//被加數字符串以單個字符的形式放入棧中 int partialSum;//對於兩個位的求和 boolean isCarry=false;//進位標誌 while(!number1Stack.isEmpty()&&!number2Stack.isEmpty())//加數和被加數棧同時非空 { partialSum=(Integer)number1Stack.pop()+(Integer)number2Stack.pop();//對於兩個位進行求和,並在棧中去除掉加數和被加數中的該位 //當有低位的進位時 if(isCarry) { partialSum++; isCarry=false; } //須要進行進位 if(partialSum>=10) { partialSum-=10; isCarry=true; } //將本位的結果放入結果棧中 result.push(partialSum); } Stack temp=!number1Stack.isEmpty()?number1Stack:number2Stack;//將temp引用指向加數和被加數中非空棧 while(!temp.isEmpty()) { //當最後一次加法運算中存在進位的時候 if(isCarry) { int t=(Integer)temp.pop();//取出其中的加數或者被加數中沒有參加的位 ++t;//進位加到此位上 if(t>=10)//當其須要進行進位的時候 { t-=10; } else//重置其進位標誌 { isCarry=false; } result.push(t); } else//最後一次執行加法運算中不須要進位 { result.push(temp.pop());//把加數或者被加數中非空的值放入和中 } } if(isCarry)//將最高位加入到結果中 { result.push(1); } String resultstr=new String(); while(!result.isEmpty()) { //把棧中的元素轉化爲字符串 resultstr=resultstr.concat(result.pop().toString()); } return resultstr; } /** * 該方法用於將輸入的大數拆分紅單個的字符,並去掉字符串中的空格,返回以單個字符爲元素的棧 * */ public Stack numberSplit(String str)throws Exception { Stack result=new Stack(); for(int i=0;i<str.length();i++) { char c=str.charAt(i);//指定索引處的char值 if(' '==c)//去除掉空格 continue; else if('0'<=c&&'9'>=c)//將數字放入棧中 result.push(Integer.valueOf(String.valueOf(c))); else throw new Exception("錯誤:輸入了非數字型的字符!"); } return result; } /** * 用於測試程序 */ public static void main(String[] args)throws Exception { BigNumberAdd a=new BigNumberAdd(); System.out.println("兩個大數爲:"); System.out.println("1. 18 452 543 389 943 209 752 345 473"); System.out.println("2. 8 123 542 678 432 986 899 334"); System.out.println("其和爲:"); System.out.println(a.add("18 452 543 389 943 209 752 345 473", "8 123 542 678 432 986 899 334")); } } 運行結果: 兩個大數爲: 1. 18 452 543 389 943 209 752 345 473 2. 8 123 542 678 432 986 899 334 其和爲: 18460666932621642739244807