C++ で 10 進乗数を作成しています。乗数は、数字のベクトルとして表される 2 つの整数を取得することによって実装されます。各ベクトルは、10 の累乗で簡単に表現できるように、その桁を逆順に格納します。たとえば、3497 = 3 * 10^3 + 4 * 10^2 + 9 * 10^1 + 7 *10^0 であり、{7, 9, 4, 3} としてベクトルに格納されます。したがって、ベクトルの各インデックスは、その桁のそれぞれの整数の 10 乗を表します。
ただし、乗算にはいくつかのバグがあります。1桁×1桁、2桁×1桁の掛け算は問題なく動くのですが、2桁×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 を返します (正しい)
私が考えることができる唯一の問題はキャリーの問題ですが、コードを見ていくうちにすべてがチェックアウトされるようです. 誰でもエラーを見ることができますか? それとも、これに対して完全に間違ったアプローチを取っていますか?