在用 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
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