使用向量的斐波那契序列

fibonacci sequence using vector

本文关键字:向量      更新时间:2023-10-16

我必须对以下斐波那契进行编码,但是我想和矢量一起做,以向我的老师展示我已经摆脱了所有课程,但是我有几个警告:

main.cpp: 18: warning: implicit conversion changes signedness:
    'int' to 'std::vector::size_type' (aka 'unsigned long long')
main.cpp: 18: warning: implicit conversion changes signedness:
    'int' to 'std::vector::size_type' (aka 'unsigned long long')

我不明白为什么它不起作用?

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> table;
    table[0] = 0;
    table[1] = 1;
    if (n == 0) { cout << n << endl; }
    else if (n == 1) { cout << n << endl; }
    else {
        for (int i = 0; i < n; i++) {
            table[i] = table[i - 1] + table[i - 2];
            cout << table[i];
        }
    }
}

问题评论中的" yksisarvinem"已经指出了问题,因此我将在此处提供更正的代码。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> table;
    for (int i = 0; i < n; i++) {
        if (n == 0 || n == 1) {
            table.push_back(n);
            cout << n << endl;
            continue;
        }
        table.push_back(table[i - 1] + table[i - 2]);
        cout << table[i];
    }
}

vector的索引运算符具有签名T& operator[](std::size_t i),并且您正在使用int变量进行索引。

您应该在for循环中使用 std::size_t i,因为索引始终是非负的。

但是,在这种情况下,此警告非常有用,因为您的代码中有一个错误。在第一次迭代时,当i=0 table[i-1] + table[i-2]表达式评估为table[-1] + table[-2]时。这不是你想要的。如果您使用std::size_t i,则索引将下注到一个大数字,并且您的索引将超出范围。

解决方案是手动设置tabular[0],tabular[1],从std::size_t i=2开始,您可能需要添加table.resize(n);

问题是您正在尝试更改向量的元素,但您的向量实际上是空的。

您可以做两件事

  1. 当您以这种方式声明矢量执行vector<int> table(n);时,您告诉它具有n非初始化元素,因此以后您可以重新分配其价值。
  2. 或者将您的新元素附加到向量:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        int n;
        cin >> n;
        vector<int> table;
        table.push_back(0);
        table.push_back(1);
        if (n == 0) {
            cout << n << endl;
        }
        else if (n == 1) {
            cout << n << endl;
        }
        else {
            for (int i = 2; i <= n; i++) {
                table.push_back(table[i - 1] + table[i - 2]);
                cout << table[i];
            }
        }
    }
    

    请注意,在for中,从0开始为索引是没有意义的:直接从2。

  3. 开始

编辑您的问题可能是,如果您在特定点输入一个大数量,fibonacci的值可能会超过int可以存储的最大值。

首先,因为您要处理正数以扩展范围始终unsigned。尝试将矢量定义为vector<unsigned long int> table;vector<unsigned long long int> table;

对于更大的值,您可以使用外部库。