更新時間:2022-09-15 來源:黑馬程序員 瀏覽量:
大家好,今天我給大家?guī)砹艘粋€小程序,它實現(xiàn)了對兩個任意大整數(shù)的相加運算。
我們知道,在Java中對整數(shù)進(jìn)行運算可以使用int類型,如果范圍不夠,可以使用long,再大可以使用double,如果想對更大的整數(shù)運算可以使用BigInteger類。今天,我們就自己來編寫一段程序,實現(xiàn)對兩個任意大的整數(shù)的加法運算。
本文將按照以下的步驟講解:
1. 實現(xiàn)思路
2. 完整代碼清單
3. 結(jié)束語
由于要表示一個很大的數(shù)字,所以,不能用基本類型存儲。這里我們使用String存儲,例如:
String s1 = "1234567890123456789012345"; String s2 = "66666666666666666666";
很顯然,兩個String類型不能做加法運算,所以我們要逐一截取出兩個字符串的最后兩個數(shù)字,然后將它們轉(zhuǎn)換為int類型再做加法運算,并將結(jié)果再存儲到一個新的結(jié)果字符串中,這樣從低位到高位,依次相加,最后的結(jié)果字符串中就是相加結(jié)果。我們先看一個簡單的例子。
- 例如有以下兩個存儲了數(shù)字的字符串:
String s1 = "1234"; String s2 = "18";
- 我們要截取出兩個字符串的最低位4和8,并轉(zhuǎn)換為int值,然后進(jìn)行加法運算。但這里涉及到一個“進(jìn)位”的問題,如果4 + 8,應(yīng)該是:進(jìn)1落2,如果是4 + 3,應(yīng)該表示為:進(jìn)0落7,所以我們要定義變量這個“進(jìn)位”的值。
String result = "";//存儲結(jié)果字符串 int c = 0;//存儲進(jìn)位的值 //截取兩個字符串的最末尾數(shù)字 String r1 = s1.substring(s1.length() - 1); String r2 = s2.substring(s2.length() - 1); //將最后一位的字符串轉(zhuǎn)換為int值 int n1 = Integer.parseInt(r1); int n2 = Integer.parseInt(r2); //相加 int v = n1 + n2; //取出個位,并添加到result字符串中 result += v % 10; //取出進(jìn)位值,存儲到c中 c = v / 10; //更改兩個字符串,分別去掉最后一位 s1 = s1.substring(0, s1.length() - 1); s2 = s2.substring(0, s2.length() - 1); //測試打印 System.out.println("結(jié)果字符串:" + result); System.out.println("進(jìn)位值:" + c); System.out.println("s1去掉最后一位:" + s1); System.out.println("s2去掉最后一位:" + s2);
程序運行后,打印結(jié)果為:
~~~java
結(jié)果字符串:2
進(jìn)位值:1
s1去掉最后一位:123
s2去掉最后一位:1
~~~
根據(jù)這個思路,我們就可以使用一個循環(huán),從低位到高位分別計算每位的和。
package com.heima.se; /** * 大整數(shù)加法運算 * 1、彈出兩個大整數(shù)最后面的整數(shù) * 2、用這兩個整數(shù)以及進(jìn)位值求和 * 3、求和的整數(shù)個位計算結(jié)果,添加到結(jié)果中;十位為進(jìn)位值,下一次循環(huán)使用。 */ public class BigIntegerAddition { public static void main(String[] args) {//1234634556790123455679011 String s1 = "1234567890123456789012345"; String s2 = "66666666666666666666"; System.out.println(add(s1, s2)); } /** * 大整數(shù)加法運算 * @param s1 * @param s2 * @return */ public static String add(String s1, String s2) { String result = "";//結(jié)果 int c = 0;//進(jìn)位值,例如兩個個位數(shù)相加有進(jìn)位,那么c表示的就是進(jìn)位 while(!s1.isEmpty() || !s2.isEmpty()|| c > 0) {//如果兩個整數(shù)以及進(jìn)位都為空,那么就結(jié)束循環(huán) int num1 = 0;//第一個整數(shù)當(dāng)前位的值,默認(rèn)為0 if(!s1.isEmpty()) {//如果第一個整數(shù)不為空 num1 = Integer.parseInt(s1.substring(s1.length()-1));//獲取最后一個字符轉(zhuǎn)換成整數(shù) s1 = s1.substring(0, s1.length()-1);//獲取后刪除最后一個字符 } int num2 = 0;//第二個整數(shù)當(dāng)前位的值,默認(rèn)為0 if(!s2.isEmpty()) { num2 = Integer.parseInt(s2.substring(s2.length()-1)); s2 = s2.substring(0, s2.length()-1); } int res = num1 + num2 + c;//計算兩個整數(shù)當(dāng)前位及進(jìn)位的和 result = res % 10 + result;//因為res可能會有進(jìn)位,所以res可能會是兩位數(shù),所以只取個位,所以模10,然后再與之前的結(jié)果連接 c = res / 10;//保存進(jìn)位的結(jié)果,在下一次循環(huán)時使用。 } return result; } }
在今天這個程序中,我們僅僅使用了String類及Integer類的一些相關(guān)方法就實現(xiàn)了兩個任意大整數(shù)的相加,通過循環(huán),從低位到高位,逐位數(shù)字的累加,并將結(jié)果存儲到一個新字符串中,是不是很簡單!后續(xù)的文章,我會為大家?guī)砀?、更有趣、更實用的一些案例,請大家持續(xù)關(guān)注哦!