HDU1021 Fibonacci Again

在这里插入图片描述

在这里插入图片描述

斐波那契数列的变形

#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;
}

看了看别人的解题思路

  1. 开一个大数组
    只不过后来的每一个保存的不是香影的和,而是求模后的结果
    注意这种数组一般的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;
}

猜你喜欢

转载自blog.csdn.net/HdUIprince/article/details/83019532