全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

Java培訓(xùn):任意大整數(shù)的相加運(yùn)算

更新時(shí)間:2022-09-15 來(lái)源:黑馬程序員 瀏覽量:

  大家好,今天我給大家?guī)?lái)了一個(gè)小程序,它實(shí)現(xiàn)了對(duì)兩個(gè)任意大整數(shù)的相加運(yùn)算。

   我們知道,在Java中對(duì)整數(shù)進(jìn)行運(yùn)算可以使用int類(lèi)型,如果范圍不夠,可以使用long,再大可以使用double,如果想對(duì)更大的整數(shù)運(yùn)算可以使用BigInteger類(lèi)。今天,我們就自己來(lái)編寫(xiě)一段程序,實(shí)現(xiàn)對(duì)兩個(gè)任意大的整數(shù)的加法運(yùn)算。

   本文將按照以下的步驟講解:

  1. 實(shí)現(xiàn)思路

  2. 完整代碼清單

  3. 結(jié)束語(yǔ)

  一. 實(shí)現(xiàn)思路

  1.1 存儲(chǔ)方式

   由于要表示一個(gè)很大的數(shù)字,所以,不能用基本類(lèi)型存儲(chǔ)。這里我們使用String存儲(chǔ),例如:

String s1 = "1234567890123456789012345";
String s2 = "66666666666666666666";

  1.2 運(yùn)算方式

   很顯然,兩個(gè)String類(lèi)型不能做加法運(yùn)算,所以我們要逐一截取出兩個(gè)字符串的最后兩個(gè)數(shù)字,然后將它們轉(zhuǎn)換為int類(lèi)型再做加法運(yùn)算,并將結(jié)果再存儲(chǔ)到一個(gè)新的結(jié)果字符串中,這樣從低位到高位,依次相加,最后的結(jié)果字符串中就是相加結(jié)果。我們先看一個(gè)簡(jiǎn)單的例子。

  1.3 簡(jiǎn)單示例

  - 例如有以下兩個(gè)存儲(chǔ)了數(shù)字的字符串:

String s1 = "1234";
String s2 = "18";

  - 我們要截取出兩個(gè)字符串的最低位4和8,并轉(zhuǎn)換為int值,然后進(jìn)行加法運(yùn)算。但這里涉及到一個(gè)“進(jìn)位”的問(wèn)題,如果4 + 8,應(yīng)該是:進(jìn)1落2,如果是4 + 3,應(yīng)該表示為:進(jìn)0落7,所以我們要定義變量這個(gè)“進(jìn)位”的值。

String result = "";//存儲(chǔ)結(jié)果字符串
int c = 0;//存儲(chǔ)進(jìn)位的值

//截取兩個(gè)字符串的最末尾數(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;

//取出個(gè)位,并添加到result字符串中
result += v % 10;
//取出進(jìn)位值,存儲(chǔ)到c中
c = v / 10;

//更改兩個(gè)字符串,分別去掉最后一位
s1 = s1.substring(0, s1.length() - 1);
s2 = s2.substring(0, s2.length() - 1);

//測(cè)試打印
System.out.println("結(jié)果字符串:" + result);
System.out.println("進(jìn)位值:" + c);
System.out.println("s1去掉最后一位:" + s1);
System.out.println("s2去掉最后一位:" + s2);

  程序運(yùn)行后,打印結(jié)果為:

  ~~~java

  結(jié)果字符串:2

  進(jìn)位值:1

  s1去掉最后一位:123

  s2去掉最后一位:1

  ~~~

   根據(jù)這個(gè)思路,我們就可以使用一個(gè)循環(huán),從低位到高位分別計(jì)算每位的和。

  二. 完整代碼清單

package com.heima.se;

/**
 * 大整數(shù)加法運(yùn)算
 * 1、彈出兩個(gè)大整數(shù)最后面的整數(shù)
 * 2、用這兩個(gè)整數(shù)以及進(jìn)位值求和
 * 3、求和的整數(shù)個(gè)位計(jì)算結(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ù)加法運(yùn)算
     * @param s1
     * @param s2
     * @return
     */
    public static String add(String s1, String s2) {
        String result = "";//結(jié)果
        int c = 0;//進(jìn)位值,例如兩個(gè)個(gè)位數(shù)相加有進(jìn)位,那么c表示的就是進(jìn)位
        while(!s1.isEmpty() || !s2.isEmpty()|| c > 0) {//如果兩個(gè)整數(shù)以及進(jìn)位都為空,那么就結(jié)束循環(huán)
            int num1 = 0;//第一個(gè)整數(shù)當(dāng)前位的值,默認(rèn)為0
            if(!s1.isEmpty()) {//如果第一個(gè)整數(shù)不為空
                num1 = Integer.parseInt(s1.substring(s1.length()-1));//獲取最后一個(gè)字符轉(zhuǎn)換成整數(shù)
                s1 = s1.substring(0, s1.length()-1);//獲取后刪除最后一個(gè)字符
            }

            int num2 = 0;//第二個(gè)整數(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;//計(jì)算兩個(gè)整數(shù)當(dāng)前位及進(jìn)位的和
            result = res % 10 + result;//因?yàn)閞es可能會(huì)有進(jìn)位,所以res可能會(huì)是兩位數(shù),所以只取個(gè)位,所以模10,然后再與之前的結(jié)果連接
            c = res / 10;//保存進(jìn)位的結(jié)果,在下一次循環(huán)時(shí)使用。
        }
        return result;
    }
}

  三. 結(jié)束語(yǔ)

   在今天這個(gè)程序中,我們僅僅使用了String類(lèi)及Integer類(lèi)的一些相關(guān)方法就實(shí)現(xiàn)了兩個(gè)任意大整數(shù)的相加,通過(guò)循環(huán),從低位到高位,逐位數(shù)字的累加,并將結(jié)果存儲(chǔ)到一個(gè)新字符串中,是不是很簡(jiǎn)單!后續(xù)的文章,我會(huì)為大家?guī)?lái)更多、更有趣、更實(shí)用的一些案例,請(qǐng)大家持續(xù)關(guān)注哦!

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!