斐波那契数列(非递归版,递归版会超时,这个好)
斐波那契数列
Problem:85
Time Limit:5000ms
Memory Limit:65536K
Description
计算斐波那契数列的值!该数列为1 1 2 3 5 8 13 21 …
Input
有多组数据,每组1行,用N表示,1 <= N <= 50。
Output
输出Fibonacci(N)的值!
Sample Input
1
2
3
Sample Output
1
1
2
Hint
Source
#include <bits/stdc++.h>
//非递归版
using namespace std;
long long F(int n)
{
long long f1=1;
long long f2=1;
long long F;
for(int i=3;i<=n;i++)
{
F=f1+f2;
f1=f2;
f2=F;
}
return F;
}
int main()
{
int n;
long long ans=0;
while(cin>>n)
{
if(n==1||n==2)
{
printf("1\n");
}
else
{
ans=F(n);
printf("%lld\n",ans);
}
}
return 0;
}
斐波那契的整除
Problem:115
Time Limit:1000ms
Memory Limit:65536K
Description
已知斐波那契数列有如下递归定义,f(1)=1,f(2)=1, 且n>=3,f(n)=f(n-1)+f(n-2),它的前几项可以表示为1, 1,2 ,3 ,5 ,8,13,21,34…,现在的问题是想知道f(n)的值是否能被3和4整除,你知道吗?
Input
输入数据有若干组,每组数据包含一个整数n(1< n <1000000000)。
Output
对应每组数据n,若 f(n)能被3整除,则输出“3”; 若f(n) 能被4整除,则输出“4”;如果能被12整除,输出“YES”;否则输出“NO”。
Sample Input
4
6
7
12
Sample Output
3
4
NO
YES
Hint
(斐波那契数重要性质:gcd(fn,fm)=f(gcd(n,m)),给出数列前几项1,1,2,3,5,8,13…
f4=3,f6=8,由以上性质可得,如果4能整除n,那么3=f4能整除fn;同理可得,如果6能整除n,那么8=f6能整除fn,即4能整除fn;)打表找规律的题
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
while(cin>>n)
{
if(n%12==0)printf("YES\n");
else
{
if(n%4==0)printf("3\n");
else if(n%6==0)printf("4\n");
else printf("NO\n");
}
}
return 0;
}
求斐波那契数函数版
Problem:827
Time Limit:1000ms
Memory Limit:65536K
Description
根据斐波那契递推关系,求解斐波那契数值
斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)
Input
输入数据有多组,一个正整数表示要求取的第几项斐波那契数值;(2 <= n <= 40)
Output
输出斐波那契数值
Sample Input
5
8
10
20
Sample Output
5
21
55
6765
Hint
Source
#include <bits/stdc++.h>
using namespace std;
int f(int a)
{
if(a==1)
{
return 1;
}
if(a==2)
{
return 1;
}
return f(a-1)+f(a-2);
}
int main()
{
int n,ans=0;
while(cin>>n)
{
cout<<f(n)<<endl;
}
return 0;
}
斐波那契数列取模问题
需要使用循环节