提问者:小点点

Pisano周期生成器对3位周期不正确


我有一个C++代码,它应该返回任何值m的Pisano周期值。 当期间为2位时,代码正常工作,但对于3位期间生成不正确的值。 例如:-Period(24)=24,正确生成的Period(25)=1243(不正确,应该=100)

#include <iostream>
using namespace std;

int main()
{
    long long m;
    cin >> m;
    long period = 1;
    long prev1 = 0;
    long cur1 = 1;
    long long prev2 = 0;
    long long cur2 = 1;
    while (1)
    {
        long long tmp = prev2;
        prev2 = cur2;
        cur2 = tmp + prev2;
        period = period + 1;
        if (((cur2 % m) == prev1) && (((cur2 + prev2) % m) == cur1))
        {
            break;
        }
    }
    cout << period;
}

共1个答案

匿名用户

当您计算下一个斐波那契数时,您需要:

    long long tmp = prev2;
    prev2 = cur2;
    cur2 = tmp + prev2;
    period = period + 1;

里面没有防止溢出的东西。 甚至long long最终会溢出。 您应该尝试只保留prev2cur2的模部分,以避免溢出。

我没有足够的数论知识来保证它会起作用,但它看起来是有道理的。