0
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++ 新手,我一直在尝试编写一个函数来计算 Pisano 周期的长度。我已经使用了这样一个事实,即一旦再次点击 0 和 1,序列就会开始重复,因此 0 之前的索引号就是 Pisano 周期长度。但是这个(我上面写的那个)显示“将堆栈跟踪转储到 pisano2.exe.stackdump”错误(pisano2.cpp 是文件名)

4

2 回答 2

1

您的向量v只有 2 个元素,因此在v[i]i >= 2添加元素的情况下访问是非法的。您应该使用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);
}
于 2021-06-25T21:34:07.163 回答
0

有几个错误。

一个,正如已经提到的,是v循环内向量的越界访问。

另一个更隐秘的是,在插入元素之后应用模块,而在存储值之前应用它可以避免整数溢出。

#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);
}

演示失败的演示

于 2021-06-25T22:06:22.907 回答