我有一个C ++代码,应该为任何值m返回Pisano周期值。当句点为两位数时,该代码可以正常工作,但是对于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;
}
答案 0 :(得分:1)
计算下一个斐波那契数时,您可以执行以下操作:
long long tmp = prev2;
prev2 = cur2;
cur2 = tmp + prev2;
period = period + 1;
里面没有什么可以防止溢出的。甚至long long
最终也会溢出。您应该尝试仅保留prev2
和cur2
的模数部分,以避免溢出。
我没有足够的数论知识来保证您可以使用,但看起来似乎很合理。