59 大數加法

leetcode上不了,做一下牛客網的

題目

以字符串的形式讀入兩個數字,再以字符串的形式輸出兩個數字的和。

輸入描述:

輸入兩行,表示兩個數字a和b,-109 <= a , b <= 109 ,用雙引號括起。

輸出描述:

輸出a+b的值,用雙引號括起。

輸入例子1:

“-26”
“100”

輸出例子1:

“74”

分析

思路一:定義String變量str1和str2分別存儲輸入的兩個大數,定義num1[]和num2[]兩個int型數組,將兩個字符串分別逐個字符逆序存入數組,定義sum[]數組存放求和結果,使用循環兩個數組中的元素逐位相加,並判斷是否進位,最後逆序輸出數組sum[]中的每個元素。

String a="99999999999";
String b="99999999999";
// 存放a的數組
int[] num1 = new int[a.length()];
// 存放b的數組
int[] num2 = new int[b.length()];
// 存放a+b的數組長度,取兩者最大的一個並+1,因爲可能有進位
int len = 1 + Math.max(a.length(),b.length());
// 存放a+b的數組
int[] res = new int[len];

// 將字符串一一填充到數組中,必須選擇逆向填充,因爲:
// 考慮1+123,如果是正向填充,那麼順序如下:
// 1
// 1 2 3
// 但是我們要執行的是從最低位開始相加,比如1+3,此時無法定位到1+3
// 如果是逆向填充,如下:
// 1
// 3 2 1
// 此時只需要按位置對應相加即可
for(int i=0;i<a.length();++i){
    // 不能使用charAt,得到的是ascii,而ascii本質上也是int
    num1[a.length()-i-1]=Integer.parseInt(a.substring(i,i+1));
}

// 將b填充到數組中
for(int i=0;i<b.length();++i){
    num2[b.length()-i-1]=Integer.parseInt(b.substring(i,i+1));
}

// 初始化進位爲0
int overflow=0;
for(int i=0;i<len-1;++i){
    // 按順序相加,並加上進位
    res[i] = num1[i]+num2[i]+overflow;
    // 如果大於10,說明需要進位
    if (res[i]>=10){
        res[i] = res[i]%10;
        overflow=1;
    }else {
        overflow=0;
    }
}
// 執行完畢之後,如果進位上爲1,那就把它放在最高位(res的最後一位)
if(overflow==1){
    res[len-1] = overflow;
}

// 逐個輸出
// 由於最後一位如果沒有產生進位,那麼會多一個0,此處將0排除
int i=len-1;
if (res[len-1]==0) i=len-2;
for (;i>=0;i--){
    System.out.print(res[i]);
}

System.out.println();

// 字符串形式輸出
StringBuffer sb = new StringBuffer();
int start=len-1;
if(res[len-1]==0) start=len-2;
while (start>=0){
    sb.append(res[start]);
    start--;
}
System.out.println(sb.toString());
// 以數字型輸出,不能通過int輸出,會報錯
System.out.println(new BigInteger(sb.toString()));

思路二:使用棧結構實現將輸入的數字依次存進棧中(棧有先進後出的特點,所以先輸入的高位上的數字會被存在棧的底層),在計算和的時候從兩個棧中依次取出數據相加存入新的棧中(計算時在棧頂的是個位,然後是十位,以此類推,存進新的棧時在棧底的是個位,然後是十位,以此類推),最後將存放計算結果的棧中元素自頂向底取出打印,這種方法效率較高,時間複雜度低,但是空間複雜度很大,需要佔用較多的空間資源。

思路三:

String str1 = "999999999999";
String str2 = "999999999999";
BigInteger a;
BigInteger b;
BigInteger c;

a = new BigInteger(str1);
b = new BigInteger(str2);
System.out.println(a.add(b).toString());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章