#include<iostream>
using namespace std;
int main()
{
int a1,a2,a3;
int n,i;
a1=a2=1;
cin>>n;
if(n<=2)
cout<<1<<endl;
else
{
for(i=3;i<=n;i++)
{
a3=(a1+a2)%10007;
a1=a2;
a2=a3;
}
cout<<a3<<endl;
}
return 0;
}
前些天接触到一道与Fibonacci数列相似的题,放在这里做一下归类:
题目:给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。
#include <iostream>
using namespace std;
int main()
{
int a1,a2,a3,a4;
int n,i;
a1=a2=a3=1;
cin>>n;
if(n<=3)
cout<<1<<endl;
else
{
for(i=4;i<=n;i++)
{
a4=(a1+a2+a3)%10000;
a1=a2;
a2=a3;
a3=a4;
}
cout<<a4;
}
return 0;
}
分析:在对于Fibonacci数列这类题型时应拒绝用数组来解决,因为当数大到一定程度时数组的容量会超出内存。
补充习题:
- 输出Fibonacci数列第n项的数值:
#include <iostream>
using namespace std;
int fib(int n)
{
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n;
cin>>n;
cout<<fib(n);
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a1,a2,a3;
int n,i;
a1=a2=1;
cin>>n;
if(n<=2)
cout<<1<<endl;
else
{
for(i=3;i<=n;i++)
{
a3=a1+a2;
a1=a2;
a2=a3;
}
cout<<a3;
}
return 0;
}
- 输出Fibonacci数列每一项的数值:
#include<iostream>
using namespace std;
int main()
{
int a1,a2,a3;
int n,i;
a1=a2=1;
cin>>n;
if(n==1)
cout<<1;
else if(n==2)
cout<<1<<" "<<1;
else if(n>2)
{
cout<<1<<" "<<1<<" ";
for(i=3;i<=n;i++)
{
a3=a1+a2;
a1=a2;
a2=a3;
cout<<a3<<" ";
}
}
return 0;
}
#include<iostream>
using namespace std;
int fib(int n)
{
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n,i=1;
cin>>n;
while(i<=n)
{
cout<<fib(i)<<" ";
i++;
}
return 0;
}
总结:Fibonacci数列问题一般情况我们有两种处理方式:递归及非递归。
递归方法设计简单,代码短,但缺陷也很明显,它的效率太慢,算法复杂度太高。
非递归方法设计稍复杂些,但效率较高,时间复杂度较短。
另外最好不要用数组来解决数列问题,当数据太大时,内存不一定够用。