程序没有正确计算减法

时间:2016-02-22 06:15:47

标签: c++ subtraction

我正在进行数学作业,而不是任何需要编程的作业,但是因为我喜欢它,所以我试着去做一些作业只是为了看看能否。这个是写整数作为斐波那契数的总和。这是代码:

#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;

int main()
{
  vector<int> fib;
  vector<int> sum;
  int n = 0;
  int total = 0;

  cout << "Enter a number." << endl;
  cin >> n;
  total = n;

  fib.push_back(1);
  fib.push_back(1);

  for(int i = 2; i <= n; i++)
  {
    fib[i] = fib[i-1] + fib[i-2];
  }

  for(int i = n; i >= 0; i--)
  {
    if(total - fib[i] >= 0)
    {
      sum.push_back(fib[i]);
      total -= fib[i];
    }
    if(total == 0)
    {
      break;
    }
    if(total < 0)
    {
      cout << "Program Error. Exiting" << endl;
      exit(1);
    }
  }

  cout << "The sequence of the fewest Fibonacci numbers adding to " << n << " is:" << endl;
  for(int i = 0; i < sum.size(); i++)
  {
    cout << sum[i] << endl;
  }

  return(0);
}

在我尝试输入数字7之前似乎运行良好。

当它到达if(total - fib[i] >= 0)时,它就像它应该的那样工作。对于某些totalfib[i]应该降至2,i也达到2。它计算这个罚款并进入if语句。但是当它total -= fib[i]时它会total = -1,从而破坏了代码。

有关如何解决此问题的任何建议吗?

编辑:这不仅仅是7.我尝试了100,并且得到了非常大的(正面和负面)数字,我太懒了,看不到它们实际上加起来是100,因为它们大约有30个左右。我不确定这会来自哪里。

Edit2:#100的问题不在于它不起作用,但对于任何有类似情况的人来说,这个值对于int来说太大了。

2 个答案:

答案 0 :(得分:3)

在您的for(int i = 2; i <= n; i++)行之前fib向量的大小仅为2,因为您没有为其保留任何空间,并且您只调用了push_back两次。< / p>

这意味着,如果您在此之后尝试设置其中的任何元素,您将遇到未定义的行为。您访问了不属于您的内存。

答案 1 :(得分:2)

更改

for(int i = 2; i <= n; i++)
{
    fib[i] = fib[i-1] + fib[i-2];
}

for (int i = 2; i <=n; i++) {
    int tmp = fib[i-1] + fib[i-2];
    fib.push_back(tmp);
}

vector<int> fib默认分配8个元素空间,vector [8+]访问会导致内存错误,你应该使用push_back(),vector会在空间满了时自动重新分配空间。