2014-02-21 19 views
1

我試圖構建一個類,bigint,它表示數組中的大數,但我在創建將此bigint與另一個bigint相乘的成員函數時遇到問題。我知道已經有一些課程可以達到這個目標,但我正在努力構建自己的學習練習。乘以整數表示爲一個數組

biguint的數字存儲在數組std::size_t data[CAPACITY]中,最低有效數字存儲在data[0]中,最高有效數字存儲在data[CAPACITY-1](小端)中。例如,如果CAPACITY=5,則12345將被表示爲data[0]=5, data[1]=4, data[2]=3, data[3]=2, data[4]=1

我已成功構建了構造函數,加法函數,尺寸函數,<<運算符函數,>>運算符函數和[]運算符函數。例如,下面的代碼工作。

int main() 
{ 
    biguint b(423); 
    biguint c(2363); 
    b += c; 
    cout << b << endl; 
    cout << b.size() << endl; 

    return 0; 
} 

將輸出:

2786 
4 

走上乘法問題,這是最接近的功能,我想出了。它可以正確計算像400 * 2一樣的bigint,但在重新編寫data[i]之後會在像400 * 20這樣的bigint上失敗。

void bigint::operator *= (const bigint &n) 
{ 
    int carryover = 0; 
    for (size_t i=0; i < size(); ++i) 
    { 
     for (size_t j=0; j < n.size(); ++j) 
     { 
      std::cout << data[i] << "*" << n[j] << "="; 
      data[i] *= n[j]; 
      std::cout << data[i] << std::endl; 
     } 
    } 
} 

我試圖做長乘法是這樣的:

109 
* 12 
____ 
    218 
+1090 
_____ 
1308 

我認爲這樣做是創建一個新的bigint正確的方式,但我得到的錯誤,lvalue required as left operand of assignment,當我嘗試這樣的事情:

void bigint::operator *= (const biguint &n) 
{ 
    int carryover = 0; 
    bigint ans(0); 
    for (size_t i=0; i < size(); ++i) 
    { 
     for (size_t j=0; j < n.size(); ++j) 
     { 
      ans[j] += data[i] * n[i]; 
      ans[j] += carryover; 
      carryover = ans[j]/10; 
      ans[j] = ans[j] % 10; 
     } 
    } 
} 

我做錯了什麼?我的方法至少是否正確?將兩個數字相加作爲小端序列的正確方法是什麼?

作爲參考,這是我編碼的+=運營商。我基本上只是手工做小學補習。

void bigint::operator += (const biguint &n) 
{ 
    int carryover = 0; 
    for (size_t i=0; i < CAPACITY; ++i) 
    { 
     data[i] += n[i]; 
     data[i] += carryover; 
     carryover = data[i]/10; 
     data[i] = data[i] % 10; 
    } 
} 
+0

我想你應該嘗試先重載'*'運算符 – yizzlez

回答

0

我解決了這個問題,但速度慢,效率低下。我只是把第一個數字加到自己的第二個數字上。我的語法有點奇怪,因爲我還沒有編寫<, >, or ++運算符。我現在會堅持這個實現,因爲它是我現在唯一的工作實現。

void biguint::operator *= (const biguint &n) 
{ 
    biguint temp(*this); 
    biguint i(1); 
    biguint one(1); 

    while (i.compare(n) != 0) 
    { 
     *this += temp; 
     i += one; 
    } 
}