本人c++ 小白,要用vector写一个加法程序,当相加的数大于6位时就会碰到这个问题。求大神解答!
![
把两个数分别存在两个vector里,然后base是进制,通过vector,分别一位对应一位的相加出和。
导致你程序崩溃的原因是: 但是你使用了越界的索引去访问carry数组的元素。修改的话,可以把 carry[i+1] 的地方改为 carry.push_back();
如下:
for(int i=0;i<a.size();i++)
{
if(a[i]+b[i]>=base)
{
//carry[i+1] = 1;
carry.push_back(1);
}
else
{
//carry[i+1] = 0;
carry.push_back(0);
}
}
但是你在考虑进位方面是有逻辑错误的,比如9 + 999,你的结果就是错误的。我在你的基础上改了一下,你参考一下。
Integer add(Integer a,Integer b,unsigned int base)
{
int len = std::max(a.size(), b.size());
Integer sum = zeros_with_digits(len + 1);
if (a.size() < b.size())
{
pad_front(a, b.size() - a.size());
}
if (a.size() > b.size())
{
pad_front(b, a.size() - b.size());
}
for (int i = len - 1; i >= 0; --i)
{
Digit sd = sum[i + 1] + a[i] + b[i];
sum[i + 1] = sd % base;
sum[i] = sd / base;
}
while(sum[0] == 0 && sum.size() > 1)
{
sum.erase(sum.begin());
}
return sum;
}
是不是溢出了,超过65536,而Integer只能支持16位。
能单步调试么,看看问题是出在哪一行?应该能调出来吧
你需要为vector预留足够的空间,在operation.cpp中加入代码:
Integer add(Integer a,Integer b,unsigned int base)
{
Integer carry,sum;
carry.reverse(20);//给carry预留空间,否则后面carry[i]将访问到不存在的索引。