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

2021-10-18 08:10:36 字數 2095 閱讀 1237

題目:在不使用biginteger類的情況下,如何計算兩個大正整數的和?

程式不可能通過一條指令計算出兩個大整數的和,但我們可以把乙個大運算拆分成多個小運算, 像小學生一樣列豎式進行按位運算。這裡還有乙個問題,我們都知道long型別的取值範圍是:

最小值:long.min_value=-9223372036854775808 (-2的63次方)

最大值:long.max_value=9223372036854775807 (2的63次方-1)

如果大整數超出了long型別能表示的範圍,我們如何儲存這樣的整數呢?

很容易想到,使用陣列儲存即可,陣列的每乙個元素對應大整數的每乙個位數。
在程式中列出的 「豎式」 究竟是什麼樣子呢?

我們以 426709752318 + 95481253129 為例,來看看大整數相加的詳細步驟:

第一步,把整數倒序儲存,整數的個位存於陣列0下標位置,最高位存於陣列長度-1下標位置。之所以倒序儲存,更加符合我們從左到右訪問陣列的習慣。

第二步,建立結果陣列,結果陣列的最大長度是較大整數的位數+1,原因很明顯。

第三步,遍歷兩個陣列,從左到右按照對應下標把元素兩兩相加,就像小學生計算豎式一樣。

第二組相加的是陣列a的第2個元素1和陣列b的第2個元素2,結果是3,再加上剛才的進製1,把4填充到result陣列的對應下標:

第三組相加的是陣列a的第3個元素3和陣列b的第3個元素1,結果是4,把4填充到result陣列的對應下標:

第四組相加的是陣列a的第4個元素2和陣列b的第4個元素3,結果是5,把5填充到result陣列的對應下標:

以此類推……一直把陣列的所有元素都相加完畢:

第四步,把result陣列的全部元素再次逆序,去掉首位的,就是最終結果:

如果給定的大整數最長位數是n,那麼建立陣列、按位運算、結果逆序的時間複雜度各自都是o(n),整體時間複雜度就是o(n)。

/** * 類描述: 大整數求和 * * @author yugu.lx 2018/10/20 23:02 pm */public class bignumsum { public static void main(string args) { char c = '7'; int i = c; //如何把 char 『7』 轉為 int 7, 不能直接int i= '7'轉化,那樣得到是『7』的ascii值,即int 55 system.out.println(i); //可以採用如下方式進行操作把 char 『7』 轉為 int 7;『0』的ascii值是48 int ii = c - '0'; system.out.println(ii); system.out.println(new bignumsum().bignumsum("426709752318

php實現兩個陣列相加的方法

例項1 朝陽區 b 海淀區 arr2 array h 西城區 a 東城區 b 豐台區 arr arr1 arr2 echo print r arr 輸出結果如下 array a 朝陽區 b 海淀區 h 西城區 改變相加的順序,例項2 朝陽區 b 海淀區 arr2 array h 西城區 a 東城區 ...

Python3實現計算兩個陣列的交集演算法示例

問題 給定兩個陣列,寫乙個方法來計算它們的交集。方案一 利用collections.counter的 運算,一步到位,找到 最小次數 的相同元素。coding utf 8 python3 def intersect nums1,nums2 type nums1 list int type nums2...

求兩個陣列的交集 並集和差集演算法分析與實現

一 陣列內資料無序且可以重複 本文採用一種交換的方式來求出兩個陣列的並集,交集和差集,這種演算法運算速度較快,記憶體消耗空間較少,是乙個值得學習的好方法,另外,作者提醒您,重要的不是演算法本身,而是該演算法會開拓我們的思維空間,要注意對問題的多思考。演算法概述 兩個任意元素的陣列,比較出兩個陣列中相...