2010-06-21 42 views
-4

夥計們我正在爲學習目的而研究叫做LINT(large int)的類,一切都很順利,直到知道。我堅持實施operator /(const LINT &)。這裏的問題是,當我想除以林特我進入遞歸調用FNC即林特:大整數除以大整數

//unfinished 
LINT_rep LINT_rep::divide_(const LINT_rep& bottom)const 
{ 
typedef LINT_rep::Iterator iter; 
iter topBeg = begin(); 
iter topEnd = end(); 
iter bottomBeg = bottom.begin(); 
iter bottomEnd = bottom.end(); 
LINT_rep topTmp;//for storing smallest number (dividend) which can be used to divide by divisor 
while (topBeg != topEnd) 
{ 
    topTmp.insert_(*topBeg);//Number not large enough add another digit 
if (topTmp >= bottom) 
{//ok number >= we can divide 
    LINT_rep topShelf = topTmp/bottom;//HERE I'M RUNNING INTO TROUBLE 
} 
else 
{ 


} 
++topBeg; 
} 
return LINT_rep("-1");//DUMMY 
} 

我試圖做的是要實現這個,如果我會被劃分這些數字手,因此,例如具有用於紅利1589和除數27,我會去像這樣:

  1. 檢查,如果第一個數字是> =除數並且如果是這樣劃分
  2. 如果不添加到第一個數字另一個數字並檢查a> b

在某些時候它會更大(在簡化的情況下),如果是的話,我必須劃分,但在這種情況下,我正在運行遞歸調用,我不知道如何打破它。
一個注意:作爲一個tmp我不得不使用LINT而不是int,因爲這些數字我不適合int。
所以一般我所要求的是有沒有其他的方式來劃分?或者,也許我的思想存在錯誤的邏輯(很可能)。 謝謝。

回答

1

當你做你的(1)部分時,你不能劃分;你必須重複減去,或猜測減去一個倍數,就像你手工操作一樣。您可以通過設置所需倍數的上限和下限以及在整個範圍內執行二進制斬波來更有效地「猜測」。

我自己也做過類似的事情;練習操作符重載是一個方便的練習。如果你願意的話,我可以提供一段代碼,儘管它使用數組和一半的異常,所以我毫不猶豫地在本站的專家級讀者面前提供它。

+0

+1謝謝你的回答,只是咀嚼它。可能需要你的幫助。 – 2010-06-21 10:25:14

0

首先,請不要在這樣的班上工作。使用CGAL的大詮釋,我認爲有一些提升bigint提交,也有大約三到四個其他流行的實現。

二,分割算法被描述如下:http://en.wikipedia.org/wiki/Long_division

[編輯]正確的方式來做到這一點:結果 位數K(C): 如果第一個數字(左起)A的,稱之爲A [nA-1]小於B [nB-1],寫入C [k]爲零。 k--(移至下一位)。 否則,您尋求最大數字C [k],以便C [k] * B * 10^k < = A.這是循環完成的。其實,前一句話就是這個私人案例。但尚未完成。你做A- = C [k] * B * 10^k(否則減去的部分爲零)。只有這樣,

k--(下一位數字)。循環直到k == 0。

不需要遞歸。只有兩個嵌套循環。

k爲一個循環(結果的數字),一個循環用於查找每個數字,一個循環(靠近它)用於減量( - =運算符)。

+0

Hai guize這是怎麼回事? – Will 2010-11-18 15:55:28