2

难以找到二维向量的总和。这看起来好吗?

int sumOfElements(vector<iniMatrix> &theBlocks)
{
  int theSum = 0;

  for(unsigned i=0; (i < theBlocks.size()); i++)
  { 
    for(unsigned j=0; (j < theBlocks[i].size()); j++)
    {
        theSum +=theBlocks[i][j];
    }
  }

  return theSum;
}

它返回一个负数,但是,它应该返回一个正数..

希望有人可以提供帮助:)

4

4 回答 4

2

代码在抽象意义上看起来是正确的,但你可能会溢出theSum。您可以尝试theSum使用 typedouble来查看您获得的值,以帮助找出正确的整数类型以用于它。

double sumOfElements(vector<iniMatrix> &theBlocks)
{
  double theSum = 0;
  /* ... */
  return theSum;
}

当您观察返回的值时,您可以查看它是否适合 anint或者您是否需要使用更宽的longlong long类型。

如果矩阵中的所有值都是正数,则应考虑使用其中一种无符号整数类型。这将使您的允许值范围加倍。

于 2012-08-17T02:09:26.703 回答
2

问题显然是 int 超出了它的边界(就像其他人说的那样)

对于有符号数据类型,它在溢出时变为负数,而对于无符号数据类型,它在溢出后再次从零开始。

如果您想务实地检测溢出,您可以粘贴这些行而不是附加行。

if( theSum > int(theSum + theBlocks[i][j]) )
    //print error message, throw exception, break, ...
    break;
else
    theSum += theBlocks[i][j];

要获得比加法处理更多数据类型和更多操作的更通用解决方案,请查看:如何检测整数溢出?

将使用一个解决方案unsigned long long,如果它也超出其边界,则您需要使用第三方库来处理大整数。

于 2013-10-08T08:17:42.087 回答
1

就像 Mokhtar Ashour 所说,可能是变量theSum溢出了。unsigned如果没有数字为负数,请尝试制作它,或者将类型从int(32 位)更改为long long(64 位)。

于 2012-08-17T05:21:49.887 回答
0

我认为这可能是int溢出问题。为了确保,您可以在内部循环完成后插入一个条件,以查看您的结果是否超出 int 范围。

if(result>sizeof(int))
    cout<<"hitting boundaries";

测试是否超出 int 边界的更好方法是在内循环结束后打印结果并注意结果。

.如果是这样,只需使用更大的数据类型。

于 2012-08-17T04:12:42.703 回答