题目描述
菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来的每个数都等于前面2个数字之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
输入
第1行是数据的组数n(n<=100000),后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1<=a<=1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
样例
输入
4
5
2
19
1
输出
5
1
181
1
不能用递归求,否则递归次数太多会导致栈溢出
#include <iostream>
using namespace std;
int fibonacci(int a)
{
if (a == 1 || a == 2)
return 1;
int f1 = 1, f2 = 1;
for (int i = 3; i <= a; i++)
{
int f = (f1 + f2) % 1000;
f1 = f2;
f2 = f;
}
return f2;
}
int main()
{
int n, a;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a;
cout << fibonacci(a) << '\n';
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n;
int a[200]; //输入的第N个数字
int f[1000001]; //将1000000个斐波那契数取1000的模都求出来
f[1]=1;
f[2]=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=3;i<1000001;i++)
{
f[i]=(f[i-1]+f[i-2])%1000; //高精度取模
}
for(int i=0;i<n;i++)
{
cout<<f[a[i]]<<endl; //将输入的数字a[i]当成脚标用于f[]中,求出输入数字的斐波那契数取模的结果
}
return 0;
}
#include<iostream>
using namespace std;
int fib(int x)
{
if(x==1||x==2)return 1;
else return (fib(x-1)+fib(x-2))%1000;
}
int main()
{
int n,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
cout<<fib(x)<<endl;
}
return 0;
}
以上是递归写法,不过递归的话容易栈溢出,可以参考楼上的递推。