题目描述
斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面 2 个数之和。
给出一个正整数 ,要求斐波那契数列中第
个数是多少。
题目链接:B2064 斐波那契数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
第 1 行是测试数据的组数 ,后面跟着
行输入。每组测试数据占 1 行,包括一个正整数
(1≤
≤30)。
输出格式
输出有 行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第
个数的大小。
解题思路
-
输入数据
-
使用数组将每一项存起来,数组从下标为1开始存,
表示第
项,其中第 1 项和第 2 项题目已经给出,从第 3 项开始,依次为前两项的和。由于
最大不超过30,因此我们可以先求出斐波那契数列的前 30 项再一起输出
-
输出数据
解题代码
C代码
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int f[31];//定义f数组为斐波那契数列
f[1] = 1;
f[2] = 1;
for(int i = 3; i <= 30; i++){
f[i] = f[i-1] + f[i-2];
}
for(int i = 0; i < n; i++){
int a;
scanf("%d",&a);
printf("%d\n",f[a]);
}
return 0;
}
C++代码
法一:和上面思路一样
#include<iostream>
using namespace std;
const int N =31;
int dp[N];
//初始化将所有范围类的情况预处理出来
//本质是动态规划
int main()
{
int t;
cin>>t;
dp[1] = dp[2] = 1;
for(int i=3;i<=N;i++){
dp[i] = dp[i-1] + dp[i-2]; //当前这一项由前两项确定
}
while(t --){
int n;
cin>>n;
cout<<dp[n]<<endl;
}
return 0;
}
法二:递归(大家可以先做了解)
#include<iostream>
using namespace std;
int dg(int n)
{
if(n == 1||n == 2) return 1; //递归终止条件
else return dg(n-1) + dg(n-2); //继续递归
}
int main()
{
int t;
cin>>t;
while(t --){
int n;
cin>>n;
cout<<dg(n)<<endl;
}
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//定义数组
int[] arr = new int[31];
//先求出前30项的斐波那契数列
arr[1] = arr[2] = 1;
//从第3项开始,每一项等于前两项的和
for (int i = 3; i <= 30; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
//输入数据
Scanner scanner = new Scanner(System.in);
//输入n
int n = scanner.nextInt();
for (int i = 1; i <= n; i++){
//输入a
int a = scanner.nextInt();
//输出数据
System.out.println(arr[a]);
}
}
}
这是一道板子题,大家如果还想练习类似的题,可以参考下面链接: