我正在用C++編寫小數乘法器。乘法器通過將兩個整數表示爲數字矢量來實現。每個矢量以相反的順序存儲其數字,以便更容易用十的冪來表示。例如,3497 = 3 * 10^3 + 4 * 10^2 + 9 * 10^1 + 7 * 10^0並存儲在向量中作爲{7,9,4,3}。因此,向量的每個索引表示該數字在該整數中的相應冪數。小數乘法器中的錯誤
但是,我在我的乘法有一些錯誤。 1位數x 1位數和2位數x 1位數乘法運算完美無缺,但卻以2位數x 2位數分解。我相當肯定,修復這個錯誤會修復所有其他錯誤與n位數字x m數字。我的乘法和加法方法的代碼如下。
vector<int> multiply(vector<int> &a, vector<int> &b) {
// check for emptiness
if(a.size() == 0)
return b;
else if(b.size() == 0)
return a;
unsigned int i; // increment counter
// compensate for size differences
if(a.size() > b.size())
for(i = 0; i < a.size()-b.size(); ++i)
b.push_back(0);
else
for(i = 0; i < b.size()-a.size(); ++i)
a.push_back(0);
int c = 0; // carry value
int temp; // temporary integer
vector<int> p; // product vector
vector<int> s; // sum vector
s.push_back(0); // initialize to 0
// multiply each digit of a by an index of b
for(i = 0; i < b.size(); ++i) {
// skip digits of 0
if(b[i] == 0)
continue;
p.resize(i,0); // resize p and add 0s
// multiply b[i] by each digit of a
for(unsigned int j = 0; j < a.size(); ++j) {
temp = c + b[i] * a[j]; // calculate temporary value
// two cases
if(temp > 9) {
c = temp/10; // new carry
p.push_back(temp % 10);
}
else {
c = 0;
p.push_back(temp);
}
}
// append carry if relevant
if(c != 0)
p.push_back(c);
// sum p and s
s = add(p, s);
p.clear(); // empty p
}
return s; // return summed vector (total product)
}
vector<int> add(vector<int> &a, vector<int> &b) {
// check for emptiness
if(a.size() == 0)
return b;
else if(b.size() == 0)
return a;
unsigned int i; // increment counter
// compensate size differences
if(a.size() > b.size())
for(i = 0; i < a.size()-b.size(); ++i)
b.push_back(0);
else
for(i = 0; i < b.size()-a.size(); ++i)
a.push_back(0);
int c = 0; // carry value
vector<int> s; // sum vector
int temp; // temporary value
// iterate through decimal vectors
for(i = 0; i < a.size(); ++i) {
temp = c + a[i] + b[i]; // sum three terms
// two cases
if(temp > 9) {
c = temp/10; // new carry
s.push_back(temp % 10); // push back remainder
}
else {
c = 0;
s.push_back(temp);
}
}
// append carry if relevant
if(c != 0)
s.push_back(c);
return s; // return sum
}
幾個測試用例:
45 * 16點返回740(應該是720) 34 * 18返回542(應該是532) 67 * 29返回2003(應爲1943) 28 * 12返回336(正確)
我能想到的唯一問題就是攜帶方面的問題,但是當我瀏覽代碼時,所有內容似乎都會檢查出來。任何人都可以看到錯誤?或者我完全採取錯誤的方法?
您是否嘗試過通過代碼在調試器步進? – 2011-01-30 20:45:05