我試圖構建一個類,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;
}
}
我想你應該嘗試先重載'*'運算符 – yizzlez