【问题标题】:Program not computing subtraction properly程序没有正确计算减法
【发布时间】:2016-02-22 06:15:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ subtraction


    【解决方案1】:

    改变

    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&lt;int&gt; fib默认分配8个元素空间,vector[8+]访问会导致内存错误,应该使用push_back(),vector满了会自动重新分配空间。

    【讨论】:

    • 太棒了。感谢代码 sn-p 和解释。这是有道理的。
    • Vector allocates 8 elements space by default 错误!它分配你告诉它多少(通过构造函数、push_back 等)
    【解决方案2】:

    for(int i = 2; i &lt;= n; i++) 行之前,fib 向量的大小只有 2,因为您没有为它保留任何空间,并且您只调用了两次 push_back

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

    【讨论】:

    • 对,我没看到。感谢您提供有用的反馈!
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多