在用 C++ 为皮萨诺时期编写函数时需要帮助

Need help in writing a function for Pisano Period in C++

int PisanoLength(int m){
    std::vector<int> v;
    v.push_back(0);
    v.push_back(1);

    int i;

    for(i = 2; ; i++){
        v[i] = v[i - 1] + v[i - 2];
        int a = v[i - 1] % m;
        int b = v[i] % m;
        if( a == 0 && b == 1)
            break;
    }

    return (i - 2);
}

你好,我是 C++ 的新手,我一直在尝试编写一个函数来计算皮萨诺时期的长度。我已经使用了这样一个事实,即一旦您再次点击 0 和 1,序列就会开始自我重复,因此 0 之前的索引号是 Pisano 周期长度。但是这个(我上面写的那个)显示 'Dumping stack trace to pisano2.exe.stackdump' 错误(pisano2.cpp 是文件名)

你的向量v只有2个元素,所以在不添加元素的情况下用i >= 2访问v[i]是非法的。您应该使用 push_back() 添加元素。

int PisanoLength(int m){
    std::vector<int> v;
    v.push_back(0);
    v.push_back(1);

    int i;

    for(i = 2; ; i++){
        v.push_back(v[i - 1] + v[i - 2]); // add elements
        int a = v[i - 1] % m;
        int b = v[i] % m;
        if( a == 0 && b == 1)
        break;
    }

    return (i - 2);
}

有几个错误。

一个,如前所述,是在循环内越界访问向量 v

另一个更狡猾的是,模块在 after 插入元素时应用,而在 before 存储值时应用它避免整数溢出。

#include <vector>
#include <cassert>

int PisanoLength(int m)
{
    if ( m <= 1 )
        return 1;

    std::vector<int> v{0, 1};

    for( int i = 2; ; ++i )
    {
        v.push_back((v[i - 1] + v[i - 2]) % m);
     //   ^^^^^^^^^                       ^^^

        if( v[i - 1] == 0  &&  v[i] == 1 )
            break;
    }

    return v.size() - 2;
}

int main()
{
    // See e.g. https://en.wikipedia.org/wiki/Pisano_period
    assert(PisanoLength(1) == 1);
    assert(PisanoLength(2) == 3);
    assert(PisanoLength(3) == 8);
    assert(PisanoLength(5) == 20);
    assert(PisanoLength(6) == 24);
    assert(PisanoLength(10) == 60);
    assert(PisanoLength(12) == 24);
}

Demo vs Failing demo