2017-04-20 20 views
0

我目前正在使用一個給我的bigint類。我成功地創建了加法減法和乘法操作,但我似乎無法破解除法運算符。Bigint分部總是返回零

我不會因爲獲得剩餘的商數而感到興奮,我只對小數點以前的數字感興趣。我也加了一些檢查。第一個如果第二個數字是零,那麼它將返回零。第二個檢查是否如果第二個數字大於第一個返回零,因爲我對低於零的數字不感興趣。

下面是我的代碼和我迄今爲止對這個大int運算符所做的工作。

Bigint operator/ (const Bigint& n1, const Bigint& n2) { 

    Bigint final; 
    Bigint quotient; 
    int count = 0; 
    Bigint result = n1; 
    Bigint check; 


    for(int i = 0; i < DIGITS; ++i) { 
     if(n2.digits[i] == 0){ 

      quotient = 0; 
     } 

     else if (n2.digits[i] > n1.digits[i]){ 

      quotient = 0; 
     } 

     else { 

      while (result.digits[0] > 0){ 
       for(int i = 0; i < DIGITS; ++i){ 
        result.digits[i] -= n2.digits[i]; 
       if(result.digits[i] < 0){ 
        result.digits[i] += 10; 
        result.digits[i+1] = -1; 
       } 
       } 
       count++; 
      } 


      for(int j = 1; j < DIGITS; j++){ 
       final.digits[j] = count % 10; 
       count = count/10; 
      } 
      return final; 
       } 

      } 
      return final; 


     } 

無論我進入我的程序,它總是返回一個零,我已經在這個幾個小時,不能爲我的生活破解它。任何幫助是極大的讚賞。

預期效果的一些例子:

987654321/123456789 = 8 
123425/545 = 226 

乾杯

+1

如果您逐行瀏覽調試器中的代碼,逐行查看所有變量及其值,看起來什麼都沒有關閉?計算中的所有步驟都是正確的? –

+0

好的,那麼** //佔位符代碼的哪一部分:只有當n2是1時才正確**你認爲我們應該忽略嗎? –

+0

@ n.m。對不起,忽略那個評論,我以爲我已經刪除它。 – websafepalletone

回答

1

我沒有大驚小怪上得到的商餘,我只是在之前的十進制數感興趣。

您需要確定您正在嘗試使用哪種數字以及您實施哪種劃分。整數沒有「小數」(不管它是什麼)。實數部分沒有餘數。

第二檢查,如果是,如果第二數量比第一

你是不是檢查,要檢查的是,第二個數字的每個數字比的對應數字的大於第一個號碼。 222和999會通過,但222和990會失敗。

Bigint quotient;

只分配,從未使用。

int count = 0;

這是你最後的結果(將其轉換爲Bigint更高版本)。如果除法的結果不符合int,它可能會溢出。那麼Bigint有什麼意義呢?

while (result.digits[0] > 0){

這似乎不是正確的。爲什麼在結果的最低有效位中看到0時停止循環?當整體結果爲零或更低時,它看起來像停止。

result.digits[i+1] = -1;

負的數字嗎?也許你想result.digits[i+1] -= 1;

count++;

您正在實施分工的重複扣除方法。儘管數學上正確,但速度很慢。 1000000000000000000000000000/2將需要loooooooooong時間來計算。

for(int j = 1; j < DIGITS; j++){

或許應該從0開始,像任何好一點for循環。