文章

【GESP】C++三级练习 luogu-B2064, 斐波那契数列

斐波那契数列本身可能并不一定涉及数组知识点,但本题中要求的输入、输出格式涉及到三级知识点一维数组的使用。 题目本身对小学生来说,也是有一定难度的。

luogu-B2064

题目要求

描述

斐波那契数列是指这样的数列:数列的第一个和第二个数都为 $1$,接下来每个数都等于前面 $2$ 个数之和。

给出一个正整数 $a$,要求斐波那契数列中第 $a$ 个数是多少。

输入

第 $1$ 行是测试数据的组数 $n$,后面跟着 $n$ 行输入。每组测试数据占 $1$ 行,包括一个正整数 $a$($1 \leq a \leq 30$)。

输出

输出有 $n$ 行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第 $a$ 个数的大小。

输入样例-1

4
5
2
19
1

输出样例-1

5
1
4181
1


题目分析

  • 读取$n$的值,表示后续输入的数量
  • 循环$n$次,读取每个测试数据$a$
  • 对每个测试数据$a$,使用循环从3开始,计算到输入的数据为止,通过每次将前两个数的和作为下一个数的值来计算斐波那契数列的第$a$个数
  • 输出计算的结果

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
int main() {
    int n; // 定义变量n,用于存储测试数据的组数
    cin >> n; // 从输入流中读取n的值
    int* inputs = new int[n]; // 动态分配一个大小为n的整数数组,用于存储输入的数据
    int an = 0; // 定义变量an,用于临时存储输入的数据
    for (int i = 1; i <= n; i++) { // 循环n次,读取每个测试数据
        cin >> an; // 从输入流中读取an的值
        inputs[i - 1] = an; // 将读取到的数据存储到inputs数组中
    }
    for (int i = 1; i <= n; i++) { // 循环n次,处理每个测试数据
        if (inputs[i - 1] == 1 || inputs[i - 1] == 2) { // 如果输入的数据是1或2
            cout << 1 << endl; // 直接输出1,因为斐波那契数列的第1和第2个数都是1
        } else { // 如果输入的数据不是1或2
            int ans = 0; // 定义变量ans,用于存储计算的结果
            int a1 = 1; // 定义变量a1,用于存储斐波那契数列的第一个数
            int a2 = 1; // 定义变量a2,用于存储斐波那契数列的第二个数
            for (int j = 3; j <= inputs[i - 1]; j++) { // 从3开始,计算到输入的数据为止
                ans = a2 + a1; // 计算斐波那契数列的下一个数
                a1 = a2; // 更新a1的值
                a2 = ans; // 更新a2的值
            }
            cout << ans << endl; // 输出计算的结果
        }
    }
    return 0; // 返回0,表示程序执行成功
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

本文由作者按照 CC BY 4.0 进行授权