斐波那契数列的变形
#include <iostream>
using namespace std;
int Fbi(int n)
{
if(n == 0)
{
return 11;
}
else if(n == 1)
{
return 7;
}
else
{
return Fbi(n-1) + Fbi(n-2);
}
}
int main()
{
int n;
while(cin >> n)
{
if(Fbi(n)%3 == 0)
{
cout << "Yes"<<endl;
}
else
{
cout << "No"<<endl;
}
}
return 0;
}
用递归的结果就是Memory Limit Exceeded
,太占空间了。。。
于是将递归改为迭代。
后来才发现把F(1)和F(0)的值给弄反了,而且输出的字符串全部是小写的
#include <iostream>
using namespace std;
int Fbi(int n)
{
int a = 7;
int b = 11;
for(int i=1; i<n; i++)
{
b = a+b;
a = b-a;
}
return b;
}
int main()
{
int n;
while(cin >> n)
{
if(Fbi(n)%3 == 0)
{
//cout << n << Fbi(n) <<endl;
cout << "yes"<<endl;
}
else
{
cout << "no"<<endl;
}
}
return 0;
}
结果是WA
在重新看一边题目,发现n为<=1000000,测试当n为1000000时,输出为
显然结果溢出了,不难想象,经过多次的迭代,类斐波那契数列增长的速度还是很快的。
导致越界。
其实只要求模就能避免这个错误,因为一个数对3的模的结果与其模的结果对3的模的结果相同。
修改后终于AC
#include <iostream>
using namespace std;
int Fbi(int n)
{
int a = 7;
int b = 11;
for(int i=1; i<n; i++)
{
b = (a+b)%3;
a = (b-a)%3;
}
return b;
}
int main()
{
int n;
while(cin >> n)
{
if(Fbi(n)%3 == 0)
{
//cout << n << Fbi(n) <<endl;
cout << "yes"<<endl;
}
else
{
cout << "no"<<endl;
}
}
return 0;
}
看了看别人的解题思路
- 开一个大数组
只不过后来的每一个保存的不是香影的和,而是求模后的结果
注意这种数组一般的main()函数外面开。
AC
#include <iostream>
using namespace std;
int a[1000000] = {0};
int main()
{
a[0] = 7;
a[1] = 11;
int n;
while(cin >> n)
{
for(int i=2; i<=n; i++)
{
a[i] = (a[i-1] + a[i-2])%3; //存储求模后的数,取值为0,1,2
}
if(a[n]%3 == 0)
{
cout << "yes" <<endl;
}
else
{
cout << "no" <<endl;
}
}
return 0;
}
更简化一点的
#include <iostream>
using namespace std;
int a[1000000] = {0};
int main()
{
a[0] = 7%3;
a[1] = 11%3;
for(int i=2; i<1000000; i++)
{
a[i] = (a[i-1] + a[i-2])%3; //存储求模后的数,取值为0,1,2
}
int n;
while(cin >> n)
{
if(!a[n]) //只有为0的时候为被3整除
{
cout << "yes" <<endl;
}
else
{
cout << "no" <<endl;
}
}
return 0;
}
但是更简单的方法是找规律;
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
if((n-2)%4 == 0) //只有为0的时候为被3整除
{
cout << "yes" <<endl;
}
else
{
cout << "no" <<endl;
}
}
return 0;
}