【发布时间】:2016-12-04 04:00:07
【问题描述】:
我想在不到 1 秒的时间内计算出一个数字 m 的皮萨诺周期。 这是我目前在 C++ 中的代码:
#include <iostream>
#include <vector>
using std::vector;
bool is_equal(vector<long long> v, long k) {
if (k == 0) return false;
// compare first and second half of array
for (long i = 0, j = k; i < k, j < v.size(); ++i, ++j) {
if (v[i] != v[j]) return false;
}
return true;
}
long long get_pisano_period(long long m) {
vector<long long> v;
long long a = 0; long k = 0; long long b = 1;
// loop until repetition is found
while (!is_equal(v, k)) {
v.push_back(a % m);
long long tmp = a + b;
a = b;
b = tmp;
k = v.size() / 2; // the mid point
}
return k;
}
对于大 m,这不会终止。我应该怎么做才能加快计算速度?我的类型有误吗?
编辑:
我已将 tmp 的类型更改为 long long,但仍然失败。
在尝试了不同的值后,程序终止所有值直到 m = 9,但对于周期为 60的 m = 10 则失败强>。 我怀疑溢出是不终止的原因。有什么建议?
【问题讨论】:
-
m 到底有多大?你是在调试模式还是发布模式下编译?
-
看起来您正在按值传递向量。也许通过引用传递?
-
i < k在逗号之前可能没有任何区别。 -
按照 flatmouse 的建议
bool is_equal(const vector<long long> &v, long k) {和i < k && j < v.size();开始。 -
您可能希望在值溢出之前在代码前面取值的模数。目前
a溢出,然后模值不再正确。