有趣的演算法題之如何實現大整數相加

2021-09-02 12:41:16 字數 2169 閱讀 2577

兩個很大很大的整數,如何求出它們的和?

我們平時在程式中求和就是直接定義兩個 int (-2 的 31 次方到 2 的 31 次方 -1)型別的數,稍大一點的數用 long (-2 的 63 次方到 2 的 63 次方 -1)型別,基本都能滿足平時的需求,那如果需要求兩個超過 long 範圍的整數的和,那麼應該怎麼辦?

其實很簡單,就跟我們小時候學大數相加的時候一樣,用豎式來計算:

這樣把豎式一列,不管多大的數,小學生都能算出來,開始分解動作。

第一步,把兩個整數的每乙個字元對應的整數取出來倒序儲存,倒序儲存是為了符合從左往右訪問陣列的習慣:

第二步,建立乙個比兩個數的長度的較大值 +1 的陣列用於存放結果,+1 是考慮進 1 的情況:

第四步,下標為 1 時,1+2=3,再加上之前進的 1,所以下標 1 的值最終為 4:

繼續遍歷直到所有元素相加完畢:

最後再將結果陣列再次倒序回來,如果首位沒有進 1,有 0 的話,去掉首位的 0 就是最終結果:

public class bignumbersumdemo 

/*** author:mrqinshou

* description:求兩個大整數相加的和

* date:2018/12/4 21:02

* param

* return

*/public static string bignumbersum(string num1, string num2)

system.out.println("num1array--->" + arrays.tostring(num1array));

// 將 num2 轉為 int 陣列,長度為結果陣列的長度,多餘的位數為 0

int num2array = new int[resultlength];

for (int i = 0; i < num2.length(); i++)

system.out.println("num2chararray--->" + arrays.tostring(num2array));

int result = new int[resultlength];

for (int i = 0; i < resultlength; i++)

result[i] = temp;

system.out.println("result--->" + arrays.tostring(result));

}stringbuilder stringbuilder = new stringbuilder();

// 定義乙個標誌位來記錄遍歷結果陣列時遇到的 0 是不是開頭的 0

boolean notstartzero = true;

// 再次倒序輸出,即為正序結果

for (int i = resultlength - 1; i >= 0; i--)

notstartzero = false;

}system.out.println("sum--->" + stringbuilder.tostring());

return stringbuilder.tostring();}}

執行後結果如下:

這個題目並不算難,先將兩個加數倒序、建立結果陣列、各位相加、結果再次倒序的時間複雜度都是 o(n),所以整個演算法的時間複雜度也是  o(n)。

PAT演算法題大整數運算之string加減法實現

pat中常考的大整數運算一般是加減法,乘除法少有考察。演算法筆記 上用的結構體實現,這裡選用stl中的string容器實現,如下 注 題目中可能會給出兩個大整數的長度或者大小關係等條件,那麼又可以根據情況精簡 比如 1024.palindromic number 25 include include...

c 兩個陣列相加 演算法 如何實現大正整數相加?

題目 在不使用biginteger類的情況下,如何計算兩個大正整數的和?程式不可能通過一條指令計算出兩個大整數的和,但我們可以把乙個大運算拆分成多個小運算,像小學生一樣列豎式進行按位運算。這裡還有乙個問題,我們都知道long型別的取值範圍是 最小值 long.min value 9223372036...

超長整數的基礎運算 演算法實現之加 減篇

上篇介紹了基礎的表示結構以及函式介紹,本篇將開始介紹加減實現的過程。由於整數有正負之分,所以兩個整數相加有四種情況 a b,a b a b和 a b 對於a b和 a b 可以通過對陣列對應位元素相加即可,主要是考慮進製問題。而a b 和 a b,其實就是兩個大整數的減法,其主要考慮的問題是向高位借...