2012-02-04 70 views
0

我找了一個明確的解釋我的問題(不找代碼),但如果一些代碼有助於解釋自己,那麼請你..執行乘法謝謝:)孤立的ArrayList元素

問:

- 使用Java的

- 主類要求用戶2個整數輸入,然後把它們分成2周的ArrayList,整數類型。每個數字都被分解並存儲在自己的索引中,所以它是它自己的「元素」,可以這麼說。

例如,現在我的代碼,它是這樣的:

「請輸入一個整數:」

「請輸入另一個整數:」

現在,在內部,我已將輸入存儲爲2個陣列列表,如下所示:

ArrayList1:[6,8,8]

ArrayList2:[3,4]

現在,讓我們說,我想執行一些mutliplication,如ArrayList1 * ArrayList2。

我可能會繼續並創建一個臨時「結果」數組列表,然後在計算完成時將該答案移至arraylist1。

但是,我遇到了麻煩的部分,正在想出一個系統清晰的方法來將數組列表放在一起。請記住,這個例子使用了分別代表長度3和2的整數列表,但這可能是任何東西。例如,我可以有一個包含50個元素的數組列表,例如[2,4,4,3,7,3,6,3,.............],它們可以表示在萬億巨大數量等

+0

如果BigInteger允許/可用/相關,則可能是更有效的方法。 – 2012-02-04 01:52:22

+0

夠公平的。從上下文來看,不確定它是否是一個練習。 – 2012-02-04 03:37:36

+1

如果您的列表[8,8,6]和[4,3]使得所表示的值是元素乘以10的指數的總和 - 否則無論您必須預先計算結果中的數字位數,或者如果需要另一個位置,則必須移動所有數字。 – 2012-02-04 15:42:12

回答

0

僞代碼:

subtotal=0 
iterate AL1 on index i (where i goes from zero to AL1.length()-1) 
{ 
    iterate AL2 on index j (where j goes from zero to AL2.length()-1)) 
    { 
    increment subtotal by AL2[AL2.length-j]*10^j * AL1[AL1.length-i]*10^i 
    increment j 
    } 
    increment i 
} 
2

除非使用一個快速算法如Karatsuba multiplication,算法如你描述兩個數相乘是簡單爲O(n^2)您在小學時學到的算法 - 將第二個列表的每個數字乘以第一個列表的每個數字,必要時攜帶。因此,對於您的第一個示例,此算法爲您提供了688 x 34 = [6 * 4,8 * 4,8 * 4] + [6 * 3,8 * 3,8 * 3,0] = [24,32, 32] + [18,24,24,0],其在攜帶之後變成 [2,7,5,2] + [2,0,6,4,0] = [2,3,3,9,2 ]。

1

這聽起來像是你最終想要在你的例子中擴大:688 * 34.爲了完成你正在使用的結構,ArrayList將使用2 for循環完成,每個列表一個(for for循環因爲它是一個可迭代的對象)。將第一個陣列中的每個元素乘以10^i次方,給出(8 * 10^0)+(8 * 10^1)+(6 * 10^2)= 688。整數在第二個列表中並乘以10^j,如同在第一個循環中完成的。通過循環保持每次迭代的運行計數器,以便在發生每次乘法運算時對其進行求和。