2012-12-31 53 views
1

我正在編寫一個程序,它允許用戶使用大數字執行算術運算,這是使用雙向鏈表構造的。到目前爲止,我已經做了一個附加功能,但現在我正在努力爲乘法做一個,我不能真正想出一些好東西。我正在考慮這樣做:在C++中乘以鏈表

假設有2個數字,1000和2000 | 0000(表示數字組成的不同節點之間的中斷)。如果你乘以數字,你將得到200 | 0000 | 0000。我可以創建一個函數,首先將2個節點相乘,然後將其分爲更小的節點。之後,它將乘以下一個節點,檢查最後一個節點的大小,如果剩餘空間,則將一部分添加到該節點並將剩餘部分放在下一個節點中。但是,如果一個數字小於另一個數字呢?那麼你會乘以一個未定義的數字..這種方法有沒有「未來」?或者我應該尋找另一個(我做了一些研究,但到目前爲止沒有發現任何用途)

+0

問題是_使用鏈表來表示大整數有一個future_,是否正確?要阻止這種非建設性的封閉是困難的,而且與C++無關,現在呢? – jogojapan

+0

老實說,未來擴展的最佳機會是使用可靠的,經過驗證的,經過測試的BigNum庫,其中有幾個庫。來自[OpenSSL](http://www.openssl.org/docs/crypto/bn.html)(我真的忘了名字,但我相信它是BIGNUM)的歷史有相當長的歷史。還有一些是C++,還有一些是C/C++的BIGNUM。如果這是爲了工作,我會選擇一條替代路線。 – WhozCraig

+0

即使你爲了好玩而自己創建BigNum版本,我也會建議使用std :: vector而不是雙向鏈表,因爲前者有更好的內存分配,所以它也更快。 –

回答

1

如果表現對你並不重要,你可以使用'highschool方法'。首先實現一種方法,將數字乘以數字,然後開始將其中一個數字與另一個數字相乘(也爲每個結果結果添加一個偏移量),然後添加這些數字。例如:

123 x 456 = 
     738 
+  615 
     492 
______________ 
     56088 

使用鏈表執行此操作應該不會太困難。

+0

不使用highschool方法開始只計算非常非常大的數字。 (數以萬計的數字)http://en.wikipedia.org/wiki/Schönhage-Strassen_algorithm –

+0

感謝您的答案。我想有時候老式的方式最好。 – user1939088