程序不能正确计算减法

Program not computing subtraction properly

我正在做一项数学作业,不是任何需要编程的事情,但因为我喜欢它,所以我尝试为一些作业做这件事,看看我是否可以。这个是写一个整数作为斐波那契数的总和。这是它的代码:

#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) 时,它会按预期工作。 total 应该下降到 2,并且 fib[i] 对于某些 i 也达到 2。它计算这个罚款并进入 if 语句。但是当它执行 total -= fib[i] 时它会生成 total = -1,从而破坏了代码。

关于如何解决这个问题有什么建议吗?

编辑:不只是 7。我尝试了 100,得到了非常大的(正数和负数)数字,我懒得看它们是否真的加起来等于 100,因为它们大约有 30 个左右.我不确定这是从哪里来的。

编辑 2:#100 的问题不是它不起作用,而是对于任何遇到类似情况的人来说,该值太大而无法容纳 int。

改变

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个元素space,vector[8+]访问会导致内存错误,应该使用push_back(),vector会自动重新分配space 满的时候。

在你的行 for(int i = 2; i <= n; i++) 之前,你的 fib 向量的大小只有 2,因为你没有为它保留任何 space,并且你调用了 push_back只有两次。

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